我想用Unity拦截,这是我的代码:
UnityContainer container = new UnityContainer();
container.AddNewExtension<Interception>();
container.RegisterType<T, T>();
container.Configure<Interception>().SetDefaultInterceptorFor<T>(new VirtualMethodInterceptor());
return container.Resolve<T>();
如果T是带有参数构造函数的类(一个空构造函数),当我调用Resolve时会抛出异常,否则它会起作用。 如何拦截具有非空构造函数的类型?
更新
UnityContainer container = new UnityContainer();
container.AddNewExtension<Interception>();
container.RegisterType<T, T>();
container.Configure<InjectedMembers>().ConfigureInjectionFor<T>(new InjectionConstructor());
container.Configure<Interception>().SetDefaultInterceptorFor<T>(new VirtualMethodInterceptor());
return container.Resolve<T>();
这段代码有效,但是如果我想使用带参数的构造函数呢?
我试过这个:
public static T Resolve<T>(object param)
{
UnityContainer container = new UnityContainer();
container.AddNewExtension<Interception>();
container.RegisterType<T, T>();
container.Configure<InjectedMembers>().ConfigureInjectionFor<T>(new InjectionConstructor(param));
container.Configure<Interception>().SetDefaultInterceptorFor<T>(new VirtualMethodInterceptor());
return container.Resolve<T>();
}
在我的代码中:
var service = Resolve<MyService>(4);
我回来时和以前一样......
答案 0 :(得分:1)
Unity将选择具有最多参数的构造函数,因此您有几个选项:
1)使用配置来指定使用no arg构造函数,如下所示:
Container.Configure<InjectedMembers>()
.ConfigureInjectionFor<MyService>(new InjectionConstructor());
2)注释你的对象
public class MyService
{
[InjectionConstructor]
public MyService()
{
}
public MyService(int arg1)
{
}
}
3)使用您自己的DefaultUnityConstructorSelectorPolicy覆盖它,如果它存在,则选择no arg构造函数。
答案 1 :(得分:1)
这是bug
答案 2 :(得分:0)
按照here所述使用InjectionConstructor属性。