Внедрение атрибутов WCF с использованием контейнера IOC
Используя ASP.NET MVC, я могу заменить FilterProvider следующим образом.
var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider);
FilterProviders.Providers.Remove(oldProvider);
FilterProviders.Providers.Add(new CustomFilterProvider(_container));
Используя мой собственный провайдер. Это не дает мне возможности использовать фабричный шаблон для создания атрибутов фильтра контроллера, но я действительно получаю возможность использовать инъекцию свойств для установки зависимостей, которые могут понадобиться атрибутам при использовании контейнера.
Можно ли сделать что-то подобное, используя WCF, чтобы я мог внедрить зависимости (встраивание свойств в порядке) в мои пользовательские классы, которые являются производными от атрибута, который я использую в своих методах службы (службы создаются с использованием IOC)?
Я использую CastleWindsors WcfFacility, но обобщенное решение (которое применимо к любому контейнеру), вероятно, будет лучшим ответом.
1 ответ
Один из способов сделать это - использовать метод OnCreate для контейнеров или аналогичный и делать что-то подобное при регистрации
Container.Register(Component.For<IMyService>().ImplementedBy<MyService>().OnCreate(WireUpAttibutes).LifeStyle.Transient);
тогда есть следующие методы
private static void WireUpAttibutes<T>(IKernel kernel, T instance) {
var attributes = instance.GetType().GetCustomAttributes(typeof(MyAttribute), false);
foreach (var attribute in attributes) {
WireUp(kernel, attribute.GetType(), attribute);
}
}
private static void WireUp(IKernel kernel, Type type, object instance) {
var properties = type.GetProperties().Where(p => p.CanWrite && p.PropertyType.IsPublic);
foreach (var propertyInfo in properties.Where(propertyInfo => kernel.HasComponent(propertyInfo.PropertyType))) {
propertyInfo.SetValue(instance, kernel.Resolve(propertyInfo.PropertyType), null);
}
}