【问题标题】:UNITY v.3 - BehaviorInterception using namespace matchingUNITY v.3 - 使用命名空间匹配的行为拦截
【发布时间】:2015-04-29 20:07:46
【问题描述】:

如何将行为应用于特定命名空间中的所有接口? 我知道如何将行为应用于像 IMyBlFacade 这样的具体接口, 但我不想单独对所有接口执行此操作,而是一次性完成。

在使用自定义 IInterfaceBehaviors 时实现 ICallHandler 是否已过时? 据我了解,两者都建立了拦截管道。

使用 ootb 调用处理程序和自定义调用处理程序而不是 IInterface 行为有什么好处?

我不希望它是这样的:

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

比较像这样(伪代码):

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

【问题讨论】:

    标签: unity-container aop enterprise-library


    【解决方案1】:

    所以使用 Unity 的 RegistrationByConvention 是部分可能的。 据我了解,你只能做简单的映射。

    对于更复杂的映射,例如使用各种 InjectionMember,您必须手动映射它们。

    您必须从 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 2018-12-27
      • 2014-06-28
      相关资源
      最近更新 更多