我有一个应用程序,它有一个基类和派生类,每个实现类都有自己的接口。我想使用 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 中是否可行?如何实现?如果需要对模型进行一些小的修正,我愿意接受,只要它们是次要的。