c# - 如何使用 ServiceStack Funq IoC 解析类型

标签 c# servicestack hangfire

我正在尝试为 HangFire 编写一个 JobActivator使用ServiceStack IoC 和我在解析类型时遇到问题。我确信对于具有更多泛型经验的人来说,这将是一个简单的答案。

我传入的容器来自 HostContext.Container

using Hangfire;
using System;
using System.Collections.Generic;
using System.Linq;
using ServiceStack;

namespace Common.Hangfire
{

    public class FunqJobActivator : JobActivator
    {

        private Funq.Container _container;

        public FunqJobActivator(Funq.Container container)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }
            _container = container;
        }

        public override object ActivateJob(Type type)
        {
            return _container.Resolve<type>();  //** this doesn't compile
        }
    }
}

最佳答案

虽然 Funq 是具有通用 API 的类型化 IOC,但您可以添加辅助扩展方法来启用使用运行时类型解析实例,例如:

public static class ContainerExtensions
{
    public static object TryResolve(this Container container, Type type)
    {
        var mi = typeof(Container).GetMethods(BindingFlags.Public | BindingFlags.Instance)
            .First(x => x.Name == "TryResolve" &&
                   x.GetGenericArguments().Length == 1 &&
                   x.GetParameters().Length == 0);

        var genericMi = mi.MakeGenericMethod(type);
        var instance = genericMi.Invoke(container, new object[0]);
        return instance;
    }
}

这将允许您使用运行时类型解析已注册的依赖项,例如:

var container = new Container();
container.Register(c => new Foo());

var instance = container.TryResolve(typeof(Foo));

关于c# - 如何使用 ServiceStack Funq IoC 解析类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29774352/

相关文章:

c# - 使用azure API管理重定向到URL

javascript - VB 到 C# 字符串转换

c# - 检查是否正在进行拖放

c# - 如何从字符串为 Lambda 表达式动态创建方法

c# - Sys.WebForms.PageRequestManagerServerErrorException : An unknown error occurred while processing the request on the server.“

inversion-of-control - 在 ServiceStack 中,获取容器的正确方法是什么

c# - 我应该将哪个 ORM 与 ServiceStack 和现有数据库一起使用

c# - OrmLite : SQLiteExceptionSQL logic error or missing database near ")": syntax error

asp.net - 执行SQL代码优化数据库时Hangfire导致Timeout过期异常 - ASP.NET Core

iis-7.5 - 部署后如何让 IIS 站点自动启动?