0

我正在使用 Ninject Event Broker 扩展,我有两个服务。ServiceOne是事件的发布者。ServiceTwo是订户。ServiceOne没有硬依赖ServiceTwo,我正在使用 DependencyCreation 扩展创建依赖。

以下是要求:

  • 我想在这两个对象之间定义一个一对一的事件。只有ServiceTwoDependencyCreation 创建的实例应该接收该事件。
  • 如果在对象图中还有其他ServiceTwo进一步向下的实例,则它们不应收到该事件。(这不应该是这种情况,但我想说明它)
  • ServiceTwo应在处置时ServiceOne处置。
  • 这是一个 Web 应用程序,它的生命周期ServiceOne应该只针对一个请求。

基本上我只是想重现我写作的行为:

var publisher = new Publisher();
var subscriber = new Subscriber();
var subscriber2 = new Subscriber();
publisher.MyEvent += subscriber.MyEventHandler;

一位出版商。一名订户。订阅者 2 没有收到该事件。

这是我的代码:

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");

两个问题。

这能满足我的要求吗?有没有更好的办法?

4

1 回答 1

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);
    }

CreateSubscriberDependency其次,使用 Dependency Creator 创建依赖项的通用方法:

    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.

然后我可以注册RegistrationServiceInRequestScope将其限制为一个请求的生命周期。

于 2013-03-20T09:38:27.317 回答