Создание перехватчиков 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. Попробуйте и дайте мне знать, если это поможет.