代码之家  ›  专栏  ›  技术社区  ›  Nicolas Dorier

单位拦截与建设者

  •  0
  • Nicolas Dorier  · 技术社区  · 16 年前

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

    我回来时也有同样的例外…

    3 回复  |  直到 16 年前
        1
  •  1
  •   Mike Valenty    16 年前

    Unity将选择参数最多的构造函数,因此您有几个选项:

    1)使用configuration指定使用no arg构造函数,如下所示:

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

    2)注释对象

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

    3)用您自己的方法重写defaultUnityConstructorSelectorPolicy,如果它存在,则选择no arg构造函数。

        2
  •  1
  •   Nicolas Dorier    16 年前

    这是一个 bug

        3
  •  0
  •   JP Alioto    16 年前

    按说明使用injectionconstructor属性 here .

    推荐文章