我有一个应用程序,它有一个基类和派生类,每个实现类都有自己的接口。我想使用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 :(得分:0)
我建议您查看Unity中的Policy Injection,而不是手动应用类型上的行为。根据政策,您必须: -