使用Unity extension 设置默认的拦截器(interceptor)

首先写一个扩展类:

/// <summary>
    /// 拦截器扩展 为每一个配置文件中注册的类型配置默认的拦截器
    ///
    /// <para>by tangjingbo at 2009-10-27 17:22</para>
    /// </summary>
    public class DefaultInterceptorInterceptionExtension : Interception
    {
        private static readonly IInterceptor[] interceptors = null;
        static DefaultInterceptorInterceptionExtension()
        {
            interceptors = (from interceptorType in
                                (from type in typeof(IInterceptor).Assembly.GetExportedTypes()
                                 where typeof(IInterceptor).IsAssignableFrom(type) &&
                                 type.IsAbstract == false &&
                                 type.IsInterface == false
                                 select type)
                            select Activator.CreateInstance(interceptorType) as IInterceptor).ToArray();
        }
        protected override void Initialize()
        {
            base.Initialize();
            IConfigurationSource configSource = ConfigurationSourceFactory.Create();
            PolicyInjectionSettings section = configSource.GetSection(PolicyInjectionSettings.SectionName) as PolicyInjectionSettings;
            if (section != null)
            {
                section.ConfigureContainer(this.Container, configSource);
            }
            this.Context.Registering += new EventHandler<RegisterEventArgs>(delegate(Object sender, RegisterEventArgs e)
            {
                this.setInterceptorFor(e.TypeFrom, e.TypeTo, e.Name);
            });
            this.Context.RegisteringInstance += new EventHandler<RegisterInstanceEventArgs>
            (
                delegate(Object sender, RegisterInstanceEventArgs e)
                {
                    this.setInterceptorFor(e.RegisteredType, e.Instance.GetType(), e.Name);
                }
            );
        }
        private void setInterceptorFor(Type typeToIntercept, Type typeOfInstance, String name)
        {
            foreach (IInterceptor interceptor in interceptors)
            {
                if ((interceptor.CanIntercept(typeToIntercept) == true) && (interceptor.GetInterceptableMethods(typeToIntercept, typeOfInstance).Count() != 0))
                {
                    if (interceptor is IInstanceInterceptor)
                    {
                        this.Container.Configure<Interception>().SetDefaultInterceptorFor(typeToIntercept, interceptor as IInstanceInterceptor);
                    }
                    else if (interceptor is ITypeInterceptor)
                    {
                        this.Container.Configure<Interception>().SetDefaultInterceptorFor(typeToIntercept, interceptor as ITypeInterceptor);
                    }
                    break;
                }
            }
        }
    }

 

然后再配置文件配置一下即可:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration, Version=1.2.0.0,                 Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>
  <unity>
    <typeAliases>
      <typeAlias alias="ISyncTimeServiceProvision" type="EntLibTest.PolicyInjectionIntegratedInUnity.ISyncTimeServiceProvision,EntLibTest" />
      <typeAlias alias="SyncTimeServiceProvisionService" type="EntLibTest.PolicyInjectionIntegratedInUnity.SyncTimeServiceProvisionService,EntLibTest" />
      <typeAlias alias="ISyncTimeProvider" type="EntLibTest.PolicyInjectionIntegratedInUnity.ISyncTimeProvider,EntLibTest" />
      <typeAlias alias="SyncTimeProvider" type="EntLibTest.PolicyInjectionIntegratedInUnity.SyncTimeProvider,EntLibTest" />
      <typeAlias alias="transparentProxy" type="Microsoft.Practices.Unity.InterceptionExtension.TransparentProxyInterceptor,Microsoft.Practices.Unity.Interception" />
      <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
    </typeAliases>
    <containers>
      <container>
        <types>
          <type type="ISyncTimeServiceProvision" mapTo="SyncTimeServiceProvisionService"/>
          <type type="ISyncTimeProvider" mapTo="SyncTimeProvider" />
        </types>
        <!--<extensionConfig>
          <add name="extendedInterception" type="EntLibTest.PolicyInjectionIntegratedInUnity.ExtendedInterceptionElement,EntLibTest"
               interceptor="TransparentProxyInterceptor"/>
        </extensionConfig>-->
        <extensions>
          <add type="Microsoft.Practices.Unity.InterceptionExtension.Interception, Microsoft.Practices.Unity.Interception" />
          <add type="EntLibTest.PolicyInjectionIntegratedInUnity.ExtendedInterception,EntLibTest" />
          <!--<add type="EntLibTest.DefaultInterceptorInterceptionExtension, EntLibTest" />-->
        </extensions>
        <extensionConfig>
          <add name="interception"
               type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationElement, Microsoft.Practices.Unity.Interception.Configuration">
            <!--<policies>
              <policy name="foo">
                <matchingRules>
                  <matchingRule name="rule1"/>
                </matchingRules>
                <callHandlers>
                  <callHandler name="handler1"/>
                  <callHandler name="handler2"/>
                </callHandlers>
              </policy>
            </policies>-->
            <interceptors>
              <interceptor  type="transparentProxy">
                <!--<default type="" />-->
              </interceptor>
            </interceptors>
          </add>
        </extensionConfig>
      </container>
    </containers>
  </unity>
</configuration>

这样会自动为ISyncTimeServiceProvision 和 ISyncTimeProvider 设置默认的拦截器

转载于:https://www.cnblogs.com/68681395/archive/2009/10/27/1590814.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值