0

我想在 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);

我回来了,和之前一样的例外......

4

3 回答 3

1

Unity 将选择具有最多参数的构造函数,因此您有以下几种选择:

1)使用配置来指定使用无参数构造函数,如下所示:

Container.Configure<InjectedMembers>()
    .ConfigureInjectionFor<MyService>(new InjectionConstructor());

2)注释你的对象

public class MyService
{
    [InjectionConstructor]
    public MyService()
    {
    }

    public MyService(int arg1)
    {     
    }
}

3)用你自己的覆盖 DefaultUnityConstructorSelectorPolicy ,如果它存在,则选择无参数构造函数。

于 2009-06-18T04:50:13.397 回答
1

这是一个错误

于 2009-06-22T19:56:42.017 回答
0

使用此处描述的 InjectionConstructor 属性。

于 2009-06-11T17:11:29.657 回答