0

我想使用约定配置我的 ninject 容器并同时创建所有选定服务的实例。我目前的解决方案是:

        var singletons = new List<Type>();
        kernel.Bind(x =>
            x.FromThisAssembly() // Scans currently assembly
                .SelectAllClasses()
                .WithAttribute<SingletonAttribute>()
                .Where(type =>
                {
                    var include = MySpecialFilterOfSomeSort(type);
                    if (include)
                    {
                        singletons.Add(type);
                    }
                    return include;
                }) // Skip any non-conventional bindings
                .BindDefaultInterfaces() // Binds the default interface to them
                .Configure(c => c.InSingletonScope()) // Object lifetime is current request only
            );
            singletons.ForEach(s => kernel.Get(s));

更多
我有一个进程内服务总线。一些组件用 [Singleton] 装饰,并将自己注册到服务总线:

// the constructor
public FooEventsListenerComponent(IServiceBus serviceBus) {
    serviceBus.Subscribe<FooEvent>(e => HandleFooEvent(e));
}

我需要在应用程序中创建所有服务总线观察者的实例。在类型映射旁边进行操作很方便(但合适吗?),因为 1. 类型已经枚举,2. 我可以访问 DI 容器。

4

1 回答 1

0

在您描述的情况下,我认为明确服务总线注册是有意义的。要扩展对您关于约定的其他问题的回答:

为监听器创建一个接口:

public interface IServiceBusSubscriber
{
    void SubscribeTo(IServiceBus serviceBus);
}

然后您可以调整您的约定以将所有继承自的类型绑定IServiceBusSubscriber到它们的默认接口(然后它们必须命名为FooServiceBusSubscriberand BarServiceBusSubscriber)或IServiceBusSubscriber显式绑定。

在使用所有绑定初始化内核后,只需执行以下操作:

IServiceBus serviceBus = kernel.Get<IServiceBus>();
foreach(IServiceBusSubscriber subscriber in kernel.GetAll<IServiceBusSubscriber>())
{
    subscriber.SubscribeTo(serviceBus)
}
于 2014-11-14T07:40:49.270 回答