Создание перехватчиков LinFu для всех типов в сборке

Я пытаюсь создать перехватчики LinFu для всех методов в моей сборке DAL. Хотя я могу сделать что-то вроде этого:

[Intercepts(typeof(IFirstRepository))]
[Intercepts(typeof(ISecondaryRepository))]
[Intercepts(typeof(IIAnotherRepository))]
public class DalInterceptor : IInterceptor, IInitialize
{
... 
}

это становится довольно грязным и требует ручного обновления каждый раз, когда в сборку добавляется новый репозиторий.

Есть ли способ автоматически создать прокси-класс для каждого типа в сборке?

ОБНОВИТЬ:

Я обновил свой прокси-конструктор, воспользовавшись предложением самого автора (г-на Лауреано), поэтому теперь у меня есть следующее:

Func<IServiceRequestResult, object> createProxy = request =>
{
    var proxyFactory = new ProxyFactory();
    DalInterceptor dalInterceptor = new DalLiteInterceptor();
    return proxyFactory.CreateProxy<object>(dalInterceptor);
};

Перехватчик настроен как прежде. У меня сейчас проблема в том, что прокси-объект не включает конструкторы и методы исходного объекта (я предполагаю, что я использую объект в универсальном методе создания).

Я просто приведу это к требуемому типу или я делаю что-то в корне неправильно?

Благодарю.

1 ответ

Решение

Похоже, вы пытаетесь использовать IOC-контейнер LinFu для перехвата различных служб, которые создаются этим контейнером. Оказывается, у LinFu есть внутренний класс, называемый ProxyInjector, который позволяет вам решать, какие службы следует перехватывать и как следует создавать прокси для каждого экземпляра службы. Вот пример кода:

Func<IServiceRequestResult, bool> shouldInterceptServiceInstance = request=>request.ServiceType.Name.EndsWith("Repository");

Func<IServiceRequestResult, object> createProxy = request =>
{
   // TODO: create your proxy instance here
   return yourProxy;
};

// Create the injector and attach it to the container so that you can selectively
// decide which instances should be proxied
var container = new ServiceContainer();
var injector = new ProxyInjector(shouldInterceptServiceInstance, createProxy);
container.PostProcessors.Add(injector);

// ...Do something with the container here

РЕДАКТИРОВАТЬ: я только что изменил класс ProxyInjector так, чтобы он стал общедоступным классом вместо внутреннего класса в LinFu. Попробуйте и дайте мне знать, если это поможет.

Другие вопросы по тегам