我已經看到了Membus的IoC的功能,我試圖來裝到簡單的注射器Membus和簡單噴油器 - 接線命令處理程序自動接口
IEnumerable<object> IocAdapter.GetAllInstances(Type desiredType)
{
var found = SimpleInjectorContainer.GetAllInstances(desiredType);
return found;
}
的想法是,我會自動註冊所有的類型與RegisterManyForOpenGeneric(typeof<CommandHandler<>),typeof<CommandHandler<>).Assembly)
。
無疑爲通常一個很好的理由,SimpleInjector不會允許多個註冊 - 不過,我想這樣做是爲了把命令處理由不同的處理器來實現的不同方面/關注。
public void MembusBootstrap()
{
this.Bus = BusSetup.StartWith<Conservative>()
.Apply <IoCSupport>(c =>
{
c.SetAdapter(SimpleInjectorWiring.Instance)
.SetHandlerInterface(typeof(HandleCommand<>));
})
.Construct();
}
public void SimpleInjectorBootstrap()
{
this.Container.Register<HandleCommand<AccountCreatedCommand>,
SetupNewAccountCommandHandler();
// next line will throw
this.Container.Register<HandleCommand<AccountCreatedCommand>,
LogNewAccountRequestToFile>();
}
當然從membus的IEnumerable<object> IocAdapter.GetAllInstances(Type desiredType)
接口期望集合,使得多個處理程序可以調用。
用SimpleInjector IoC與Membus結婚的最佳方式是什麼?
腳註
我看到其他的方式通過公約wireup menbus:
public interface YetAnotherHandler<in T> {
void Handle(T msg);
}
public class CustomerHandling : YetAnotherHandler<CustomerCreated>
...
var b = BusSetup
.StartWith<Conservative>()
.Apply<FlexibleSubscribeAdapter>(c => c.ByInterface(typeof(YetAnotherHandler<>))
.Construct();
var d = bus.Subscribe(new CustomerHandling());
但是我真的很想和IoC容器堅持處理壽命範圍,並避免實例命令處理程序並在需要之前手動連線它們。
請注意,雖然這些實現的註冊集合中的順序是不確定的。如果順序很重要,則將已排序的列表傳遞給RegisterAll方法。例如:'implTypes.OrderBy(t => t.Name)'。 – Steven 2013-04-21 07:34:29