0

Использование ASP.NET MVC Я могу заменить FilterProvider как этоWCF Атрибут инъекции с использованием контейнера МОК

var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider); 
FilterProviders.Providers.Remove(oldProvider); 
FilterProviders.Providers.Add(new CustomFilterProvider(_container)); 

Используя свой собственный провайдер. Это не дает мне возможность использовать шаблон фабрики для создания атрибутов фильтра контроллера, но я получаю возможность использовать вложение свойств для установки зависимостей, которые могут понадобиться атрибутам с помощью контейнера.

Возможно ли сделать что-то подобное с помощью WCF, чтобы я мог впрыскивать зависимости (вложение свойств в порядке) в мои пользовательские классы, которые происходят из Attribute, которые я использую в своих методах обслуживания (службы создаются с помощью 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); 
    } 
    }