Ninject DependencyCreation和EventBroker扩展。确保一对一订阅

时间:2013-01-16 11:58:05

标签: ninject ninject.web.mvc ninject-extensions

我正在使用Ninject Event Broker扩展,我有两项服务。 ServiceOne是活动的发布者。 ServiceTwo是订阅者。 ServiceOneServiceTwo没有硬依赖关系,我正在使用DependencyCreation扩展创建依赖关系。

以下是要求:

  • 我想在这两个对象之间定义一对一的事件。只有DependencyCreation创建的ServiceTwo实例才能收到该事件。
  • 如果对象中还有ServiceTwo的其他实例 图表他们不应该收到该事件。 (情况不应该如此 但我想说明这一点)
  • 处置ServiceTwo时,应处理
  • ServiceOne
  • 这是一个Web应用程序,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");

两个问题。

这是否符合我的要求? 还有更好的方法吗?

1 个答案:

答案 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,将此限制为一个请求的生命周期。