在接口上拦截
Intercepting on an Interface
我正在尝试制作类似 IAuditable
接口的东西,它充当 Ninject 的标记以拦截对.
的调用
假设我有以下内容:
public interface IAuditable
{
}
public interface IProcessor
{
void Process(object o);
}
public class Processor : IProcessor, IAuditable
{
public void Process(object o)
{
Console.WriteLine("Processor called with argument " + o.ToString());
}
}
使用此设置:
NinjectSettings settings = new NinjectSettings() { LoadExtensions = true };
IKernel kernel = new StandardKernel(settings);
kernel.Bind<IAuditAggregator>().To<AuditAggregator>().InThreadScope();
kernel.Bind<IAuditInterceptor>().To<AuditInterceptor>();
kernel.Bind(x =>
x.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<IAuditable>()
.BindToDefaultInterfaces() //I suspect I need something else here
.Configure(c => c.Intercept().With<IAuditInterceptor>()));
kernel.Bind<IProcessor>().To<Processor>();
每当我尝试 kernel.Get<IProcessor>();
时,我都会收到一个异常,告诉我有多个绑定可用。
如果我删除 kernel.Bind<IProcessor>().To<Processor>()
那么它会按预期工作,但是您可能有一个 IProcessor
没有实现 IAuditable
.
我走在正确的轨道上吗?
编辑:按照建议,我尝试改用属性:
public class AuditableAttribute : Attribute
{
}
[Auditable]
public class Processor : IProcessor
{
public void Process(object o)
{
Console.WriteLine("Processor called with argument " + o.ToString());
}
}
//in setup:
kernel.Bind(x =>
x.FromThisAssembly()
.SelectAllClasses()
.WithAttribute<AuditableAttribute>()
.BindDefaultInterface()
.Configure(c => c.Intercept().With<IAuditInterceptor>()));
这会导致与使用接口相同的重复绑定问题。
您应该能够为实现 IAuditable 的类型编写一个约定绑定,为未实现的类型编写一个约定绑定。
kernel.Bind(x =>
x.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<IAuditable>()
.BindDefaultInterfaces()
.Configure(c => c.Intercept().With<IAuditInterceptor>()));
kernel.Bind(x =>
x.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<IProcessor>()
.Where(t => !typeof(IAuditable).IsAssignableFrom(t))
.BindDefaultInterfaces());
我正在尝试制作类似 IAuditable
接口的东西,它充当 Ninject 的标记以拦截对.
假设我有以下内容:
public interface IAuditable
{
}
public interface IProcessor
{
void Process(object o);
}
public class Processor : IProcessor, IAuditable
{
public void Process(object o)
{
Console.WriteLine("Processor called with argument " + o.ToString());
}
}
使用此设置:
NinjectSettings settings = new NinjectSettings() { LoadExtensions = true };
IKernel kernel = new StandardKernel(settings);
kernel.Bind<IAuditAggregator>().To<AuditAggregator>().InThreadScope();
kernel.Bind<IAuditInterceptor>().To<AuditInterceptor>();
kernel.Bind(x =>
x.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<IAuditable>()
.BindToDefaultInterfaces() //I suspect I need something else here
.Configure(c => c.Intercept().With<IAuditInterceptor>()));
kernel.Bind<IProcessor>().To<Processor>();
每当我尝试 kernel.Get<IProcessor>();
时,我都会收到一个异常,告诉我有多个绑定可用。
如果我删除 kernel.Bind<IProcessor>().To<Processor>()
那么它会按预期工作,但是您可能有一个 IProcessor
没有实现 IAuditable
.
我走在正确的轨道上吗?
编辑:按照建议,我尝试改用属性:
public class AuditableAttribute : Attribute
{
}
[Auditable]
public class Processor : IProcessor
{
public void Process(object o)
{
Console.WriteLine("Processor called with argument " + o.ToString());
}
}
//in setup:
kernel.Bind(x =>
x.FromThisAssembly()
.SelectAllClasses()
.WithAttribute<AuditableAttribute>()
.BindDefaultInterface()
.Configure(c => c.Intercept().With<IAuditInterceptor>()));
这会导致与使用接口相同的重复绑定问题。
您应该能够为实现 IAuditable 的类型编写一个约定绑定,为未实现的类型编写一个约定绑定。
kernel.Bind(x =>
x.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<IAuditable>()
.BindDefaultInterfaces()
.Configure(c => c.Intercept().With<IAuditInterceptor>()));
kernel.Bind(x =>
x.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<IProcessor>()
.Where(t => !typeof(IAuditable).IsAssignableFrom(t))
.BindDefaultInterfaces());