2013-04-21 4 views
0

У меня есть приложение, у которого есть базовый класс и производные классы, причем каждый класс реализации имеет свой собственный интерфейс. Я хотел бы использовать перехват Unity для обработки исключений на производных типах базового класса.Перехват базового класса Microsoft 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 и как? Если необходимы небольшие корректировки модели, я открыт для них, если они незначительны.

ответ

0

Я предлагаю вам взглянуть на политическую инъекцию в Unity, а не на ручное применение поведения по типам. С политикой вы должны: -

  1. Создайте класс, который реализует ICallHandler (в основном, вырезать IInterceptionBehavior) - это будет ваше поведение обработчика исключений.
  2. Создайте политику, которая имеет «соответствующие правила» - в вашем случае - политику, которая использует ваш CallHandler для любых зарегистрированных типов, реализующих BaseService или аналогичные.
  3. Вам все равно придется регистрировать все свои услуги в Unity, но теперь перейдите в Interceptor и InterceptionBehavior. Если у вас много услуг, я бы предложил посмотреть на что-то вроде моего Unity Automapper, что упростит как регистрацию, так и необходимость возиться с поведением перехвата.