2013-04-20 57 views
2

我已經看到了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容器堅持處理壽命範圍,並避免實例命令處理程序並在需要之前手動連線它們。

回答

2

您可以有多個註冊。下面是一個例子(道歉,但我的電腦今天去世了,我在記事本寫這):

SimpleInjectorContainer.RegisterManyForOpenGeneric(typeof(CommandHandler<>), 
    AccessibilityOption.PublicTypesOnly, 
    (serviceType, implTypes) => container.RegisterAll(serviceType, implTypes), 
    AppDomain.CurrentDomain.GetAssemblies() 
); 

,他們可以與檢索:

public IEnumerable<CommandHandler<T>> GetHandlers<T>() 
    where T : class 
{ 
    return SimpleInjectorContainer.GetAllInstances<CommandHandler<T>>(); 
} 

你會發現這些版本的RegisterManyForOpenGeneric的和GetAllInstances方法描述here

我使用這種技術來支持發佈/訂閱框架。你可以有ň獨立CommandHandler

+0

請注意,雖然這些實現的註冊集合中的順序是不確定的。如果順序很重要,則將已排序的列表傳遞給RegisterAll方法。例如:'implTypes.OrderBy(t => t.Name)'。 – Steven 2013-04-21 07:34:29

1

至於其他信息,this blog post here(免責聲明 - 我的網站)概述瞭如何MemBus這些天連接到DI容器。

+0

感謝創建membus標籤,我沒有足夠的法力創造:)這使我對約'SetHandlerInterface'第二個相關的問題在這裏http://stackoverflow.com/questions/16125285/multiple-types-for-sethandlerinterface -with-membus和 - IOC-容器 – g18c 2013-04-20 21:17:48

相關問題