我刚刚开始使用Unity和拦截功能。我创建了一个原型来验证限制或能力,在我看来,为了拦截方法,必须满足几个条件。特别是在我看来,必须通过容器来解析类或接口。那是对的吗?有没有任何方法让我这样做没有这个要求。
我可能会错误地解释如何正确使用它,因为如果没有良好的工作示例,那里会有很多旧的和部分的信息。
我会用一些代码更新。请记住,这个东西中有成千上万行代码,所以改变这个糟糕的设计不是一个选项,超出了当前项目的范围。
public interface IApoClass
{
[LoggingCallHandler]
void SomeAbstractAopMethod(string abstractparam);
[LoggingCallHandlerAttribute]
void SomeVirtualAopMethod(string virtualparam);
}
public abstract class AbstractAopClass : IApoClass
{
public abstract void SomeAbstractAopMethod(string whatthe);
public virtual void SomeVirtualAopMethod(string abstractparam)
{
//essentiall do nothing
return;
}
}
public class NonAbstractAopMethod : AbstractAopClass
{
public override void SomeAbstractAopMethod(string whatthe)
{
Console.Write("I am the only enforced method");
}
}
容器:
container.AddNewExtension<Interception>();
//container.Configure<Interception>().SetInterceptorFor<IFrameworkInterceptionTest>(new InterfaceInterceptor());
container.Configure<Interception>().SetInterceptorFor<IApoClass>(new InterfaceInterceptor());
主叫代码:
//resolve it despite it not having and definition, but we've wired the container for the interface implemented by the abstract parent class
var nonabstractmethod = DependencyResolver.Current.GetService<NonAbstractAopMethod>();
nonabstractmethod.SomeAbstractAopMethod("doubt this works");
nonabstractmethod.SomeVirtualAopMethod("if the above didn't then why try");
答案 0 :(得分:3)
您的假设是正确的:如果您希望使用拦截,则需要通过容器解析对象,以便Unity可以创建代理对象或返回派生类型。
Unity Interception Techniques很好地解释了它是如何运作的。
如果我理解正确,您希望对接口方法执行拦截,同时尽量减少对现有系统的更改。
你应该能够拦截拦截。首先注册接口和要映射的具体类型,然后设置拦截:
IUnityContainer container = new UnityContainer();
container.AddNewExtension<Interception>();
container.RegisterType<IApoClass, NonAbstractAopMethod>()
.Configure<Interception>()
.SetInterceptorFor<IApoClass>(new InterfaceInterceptor());
DependencyResolver.SetResolver(new UnityServiceLocator(container));
var nonabstractmethod = DependencyResolver.Current.GetService<IApoClass>();
nonabstractmethod.SomeAbstractAopMethod("doubt this works");
nonabstractmethod.SomeVirtualAopMethod("if the above didn't then why try");
如果需要将界面映射到多个具体类型,可以使用名称
来实现container.RegisterType<IApoClass, NonAbstractAopMethod2>(
typeof(NonAbstractAopMethod2).Name)
.Configure<Interception>()
.SetInterceptorFor<IApoClass>(
typeof(NonAbstractAopMethod2).Name,
new InterfaceInterceptor()
);