Перехват единства и конструкторы - PullRequest
0 голосов
/ 11 июня 2009

Я бы хотел использовать перехват с 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 ]

1 голос
/ 18 июня 2009

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 голос
/ 22 июня 2009
0 голосов
/ 11 июня 2009

Используйте атрибут InjectionConstructor, как описано здесь .

...