如何使用ServiceStack Funq的IoC解决型 [英] How to resolve type using ServiceStack Funq IoC

查看:742
本文介绍了如何使用ServiceStack Funq的IoC解决型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想写使用的迟发型一个JobActivator:// servicestack.net相对=nofollow> ServiceStack 国际奥委会和我无法从类型解析。我敢肯定,这将是一个人与泛型更多的经验,一个简单的答案。



我传递的容器从HostContext.Container未来



 使用迟发型; 
使用系统;
使用System.Collections.Generic;
使用System.Linq的;
使用ServiceStack;

命名空间Common.Hangfire
{

公共类FunqJobActivator:JobActivator
{

私人Funq.Container _container;

公共FunqJobActivator(Funq.Container容器)
{
如果(集装箱== NULL)
{
抛出新的ArgumentNullException(容器);
}
_container =容器;
}

公众覆盖对象ActivateJob(type类型)
{
返回_container.Resolve<&型GT;(); // **这不会编译
}
}
}


解决方案

虽然Funq是一种类型化的国际奥委会与通用的API,可以添加一个辅助扩展方法,使使用运行时类型解决的情况下,例如:

 公共静态类ContainerExtensions 
{
公共静态对象TryResolve(此容器的容器,类型型)
{
变种MI = typeof运算(集装箱).GetMethods(BindingFlags.Public | BindingFlags.Instance)
。首先(X => x.Name ==TryResolve&放大器;&安培;
x.GetGenericArguments()。长度== 1安培;&安培;
x.GetParameters()长度== 0)。

VAR genericMi = mi.MakeGenericMethod(类型);
无功实例= genericMi.Invoke(集装箱,新的对象[0]​​);
返回实例;
}
}



这将允许你使用一个运行时解决注册的依赖类型,例如:

  VAR集装箱=​​新容器(); 
container.Register(C =>新建美孚());

无功实例= container.TryResolve(typeof运算(富));


I'm trying to write a JobActivator for HangFire using ServiceStack IoC and I'm having trouble resolving from a type. I'm sure this will be an easy answer for someone with more experience with generics.

The container I'm passing in is coming from 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
        }
    }
}

解决方案

Whilst Funq is a typed IOC with Generic API's, you can add a helper extension method to enable resolving instances using a runtime type, e.g:

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;
    }
}

Which will allow you to resolve registered dependencies using a runtime Type, e.g:

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

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

这篇关于如何使用ServiceStack Funq的IoC解决型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆