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