2015-04-19 1 views
0

Как применить поведение ко всем интерфейсам в определенном пространстве имен? Я знаю, как применить поведение к конкретному интерфейсу, например IMyBlFacade, , но я не хочу делать это для всех интерфейсов отдельно, но одним выстрелом.UNITY v.3 - BehaviorInterception с использованием соответствия пространства имен

Осуществляет ли ICallHandler устаревшее использование пользовательских IInterfaceBehaviors? Как я понимаю, как построить трубопровод для перехвата.

В чем преимущество использования диспетчеров вызовов ootb и пользовательских обработчиков вызовов над IInterfacebehaviors?

Я не хочу, чтобы это было так:

unity.RegisterType<IMyService, MyService>(
new ContainerControlledLifetimeManager(), 
new Interceptor<InterfaceInterceptor>(), 
new InterceptionBehavior<OutputInterceptionBehavior>()); 

скорее как этот (псевдо-код):

unity.addInterceptor<InterfaceInterceptor>() 
.addMachingRule<namespace>("mynamespace") 
.addBehaviors(...); 

ответ

0

Так что отчасти можно с помощью RegistrationByConvention Юнити. Насколько я понял, вы можете делать простые сопоставления.

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

Вы должны наследовать от RegistrationConvention, чтобы создать свою собственную реализацию соглашения.

public class UnityRegistrationByConventions : RegistrationConvention 
{ 

    private readonly IUnityContainer _container; 
    List<string> _assemblyNameFilter; 
    List<string> _namespaceFilterForClasses; 

    public UnityRegistrationByConventions(IUnityContainer container, List<string> assemblyNameFilter = null, List<string> namespaceFilterForClasses = null) 
    { 
     _container = container; 
     _assemblyNameFilter = assemblyNameFilter; 
     _namespaceFilterForClasses = namespaceFilterForClasses; 
    } 

    public override Func<Type, IEnumerable<Type>> GetFromTypes() 
    { 
     return WithMappings.FromMatchingInterface; 
    } 

    public override Func<Type, IEnumerable<InjectionMember>> GetInjectionMembers() 
    { 
     return (t => new List<InjectionMember>(){ 
       new Interceptor<InterfaceInterceptor>(), 
       new InterceptionBehavior<LoggingInterceptionBehavior>(),  // 1 
       new InterceptionBehavior<ExceptionInterceptionBehavior>(), // 2 
       new InterceptionBehavior<CachingInterceptionBehavior>(),  // 3 
       new InterceptionBehavior<ValidationInterceptionBehavior>()} as IEnumerable<InjectionMember>); 
    } 

    public override Func<Type, LifetimeManager> GetLifetimeManager() 
    { 
     return t => WithLifetime.Transient(t); 
    } 

    public override Func<Type, string> GetName() 
    { 
     return (type => (this._container.Registrations.Select(x => x.RegisteredType) 
      .Any(r => type.GetInterfaces().Contains(r) == true) == true) ? WithName.TypeName(type) : WithName.Default(type)); 
    } 

    public override IEnumerable<Type> GetTypes() 
    { 

     var allAssemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => _assemblyNameFilter.Contains(a.FullName.Split(',')[0])); 
     List<Type> allClasses = new List<Type>(); 


     foreach (var assembly in allAssemblies) 
     { 
      var classArray = assembly.GetTypes().Where(t => t.IsPublic && 
       !t.IsAbstract && 
       t.IsClass == true && 
       _namespaceFilterForClasses.Contains(t.Namespace)); 
      if (classArray != null && classArray.Count() > 0) 
       allClasses.AddRange(classArray); 
     } 

     return allClasses; 
    } 
} 

и применять конвенцию как этот

var rby = new UnityRegistrationByConventions(unityContainer, assFilter, classNamespaceFilter); 

 Смежные вопросы

  • Нет связанных вопросов^_^