c# – 在接口上拦截
发布时间:2020-12-15 22:46:24 所属栏目:百科 来源:网络整理
导读:我试图创建类似IAuditable接口的东西,它充当Ninject拦截调用的标记. 假设我有以下内容: public interface IAuditable{}public interface IProcessor{ void Process(object o);}public class Processor : IProcessor,IAuditable{ public void Process(object
我试图创建类似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>().到< Processor>()然后它按预期工作,但你可能有一个不实现IAuditable的IProcessor. 我是在正确的轨道上吗? 编辑:建议我尝试使用属性: 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()); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |