我正在使用Ninject Event Broker扩展,我有两项服务。 ServiceOne
是活动的发布者。 ServiceTwo
是订阅者。 ServiceOne
与ServiceTwo
没有硬依赖关系,我正在使用DependencyCreation扩展创建依赖关系。
以下是要求:
ServiceTwo
实例才能收到该事件。ServiceTwo
的其他实例
图表他们不应该收到该事件。 (情况不应该如此
但我想说明这一点)ServiceTwo
时,应处理ServiceOne
。ServiceOne
的生命应该只是
一个请求。基本上我只是想重新创作我写作的行为:
var publisher = new Publisher();
var subscriber = new Subscriber();
var subscriber2 = new Subscriber();
publisher.MyEvent += subscriber.MyEventHandler;
一位出版商。一个订户。 Subscriber2没有得到该事件。
这是我的代码:
this.Bind<IServiceOne, ServiceOne>().To<ServiceOne>().Named("ServiceOne").OwnsEventBroker("ServiceOne").RegisterOnEventBroker("ServiceOne");
this.Kernel.DefineDependency<IServiceOne, IServiceTwo>();
this.Bind<IServiceTwo>().To<ServiceTwo>().WhenParentNamed("ServiceOne").InDependencyCreatorScope().RegisterOnEventBroker("ServiceOne");
两个问题。
这是否符合我的要求? 还有更好的方法吗?
答案 0 :(得分:0)
我通常不喜欢回答我自己的问题,但看到这已经安静了一段时间,我一直在测试我的代码示例,它似乎工作正常。为了清理这些依赖项的创建和整个事件代理注册过程,我创建了一些扩展方法。首先关闭创建范围事件代理的IsPublisher
扩展名:
public static ISubscriberBuildingSyntax IsPublisher<TPublisher>(this IBindingWhenInNamedWithOrOnSyntax<TPublisher> syntax)
{
string name = Guid.NewGuid().ToString();
syntax.Named(name);
syntax.OwnsEventBroker(name).RegisterOnEventBroker(name);
return new SubscriberBuildingSyntax<TPublisher>(syntax, name);
}
其次,使用Dependency Creator创建依赖关系的通用CreateSubscriberDependency
方法:
public ISubscriberBuildingSyntax CreateSubscriberDependency<TSubscriber>() where TSubscriber : class
{
this.syntax.Kernel.DefineDependency<TPublisher, TSubscriber>();
this.syntax.Kernel.Bind<TSubscriber>().ToSelf().WhenParentNamed(this.name).InDependencyCreatorScope().RegisterOnEventBroker(this.name);
return this;
}
我可以这样称呼它:
this.Bind<IRegistrationService>().To<RegistrationService>()
.IsPublisher()
.CreateSubscriberDependency<RoleService>();
这将创建一个范围为RegistrationService
实例的事件代理,其RoleService
依赖关系与RegistrationService
的生命周期相关联。
然后,我可以RegistrationService
注册InRequestScope
,将此限制为一个请求的生命周期。