如何使用ServiceStack Funq的IoC解决型 [英] How to resolve type using 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屋!