Microsoft Unity基类拦截

时间:2013-04-21 10:16:18

标签: unity-container unity-interception

我有一个应用程序,它有一个基类和派生类,每个实现类都有自己的接口。我想使用Unity的拦截来对基类的派生类型进行异常处理。

我是拦截的新手,所以我不知道所有的怪癖。据我所知,我必须在每个实现解析时注册拦截。关键是我的所有实现都有一个基类,所以我认为我可以跳过冗余并仅在基类上设置拦截,这将触发每个实现类。

这是我的设置:

public class NotificationViewModel
{
   // some properties
}

public class CompanyViewModel : NotificationViewmodel
{
   // some properties
}

public class BaseService
{
}

public interface ICompanyService
{
   public NotificationViewModel Test();
}

public class CompanyService : BaseService, ICompanyService
{
   public CompanyViewModel Test()
   {
      // call exception
   }
}

public class TestUnityContainer : UnityContainer
{
   public IUnityContainer RegisterComponents()
   {
      this
         .AddNewExtension<Interception>()
         .RegisterType<ICompanyService, CompanyService>(
            new Interceptor<InterfaceInterceptor>(),
            new InterceptionBehavior<TestInterceptionBehavior>());

      return this;
    }
}

public class TestInterceptionBehavior : IInterceptionBehavior
{
   public IEnumerable<Type> GetRequiredInterfaces()
   {
      return new[] { typeof( INotifyPropertyChanged ) };
   }

   public IMethodReturn Invoke( IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext )
   {
      IMethodReturn result = getNext()( input, getNext );

      if( result.Exception != null && result.Exception is TestException )
      {             
         object obj = Activator.CreateInstance( ( ( System.Reflection.MethodInfo )input.MethodBase ).ReturnType );
         NotificationViewModel not = ( NotificationViewModel )obj;
         // do something with view model
         result.ReturnValue = obj;
         result.Exception = null;
      }

      return result;
   }

   public bool WillExecute
   {
      get { return true; }
   }
}

这很好用,但我想在TestUnityContainer

中有类似的内容
public class TestUnityContainer : UnityContainer
{
   public IUnityContainer RegisterComponents()
   {
      this
         .AddNewExtension<Interception>()
         .RegisterType<BaseService>(
            new Interceptor<InterfaceInterceptor>(),
            new InterceptionBehavior<TestInterceptionBehavior>() );
         .RegisterType<ICompanyService, CompanyService>();

      return this;
    }
}

我将有更多的服务类继承自基本服务,我认为这会节省我很多时间,因为它们都有相同的拦截行为。

Unity可以实现这一点吗?如果对模型进行一些微小的修正是必要的,我会对他们开放,只要它们是次要的。

1 个答案:

答案 0 :(得分:0)

我建议您查看Unity中的Policy Injection,而不是手动应用类型上的行为。根据政策,您必须: -

  1. 创建一个实现ICallHandler的类(基本上是一个减少的IInterceptionBehavior) - 这将是你的异常处理程序行为。
  2. 创建一个具有“匹配规则”的策略 - 在您的情况下,是一个策略,它将您的CallHandler用于任何实现BaseService或类似的注册类型。
  3. 您仍然需要将所有服务注册到Unity中,但现在传入Interceptor和InterceptionBehavior。如果您有很多服务,我建议您查看类似我Unity Automapper的内容,这样可以简化注册并避免陷入拦截行为。