我注意到我經常需要實現複合圖案。例如:Autofac複合圖案
interface IService { ... }
class Service1 : IService { ... }
class Service2 : IService { ... }
class CompositeService : IService
{
public CompositeService(IEnumerable<IService> services) { ... }
...
}
我想在容器中註冊CompositeService作爲IService,並且注入了依賴關係。
(看起來有點類似裝飾裝潢卻一組服務,而不是隻有一個)
什麼是做在autofac的最佳方式?
理想解決方案如何(C#)?
更新:
我目前的註冊是:
builder.RegisterType<Service1>().Named<IService>("impl");
builder.RegisterType<Service2>().Named<IService>("impl");
builder.Register(c => new CompositeService(c.Resolve<IEnumerable<IService>>("impl")))
.As<IService>();
它類似於裝飾手工在http://nblumhardt.com/2011/01/decorator-support-in-autofac-2-4
是否可以改進?
我也會提出一個簡單的例子: 'builder.RegisterCompositeType(「impl」)'。我只是不喜歡手動調用構造函數,因爲依賴關係可以被注入。 –
2011-03-01 06:12:10
@Konstantin Spirin:我曾考慮過這種超載,但想明確我的答案是怎麼回事。我唯一會改變的是我仍然會使用'WithElementsNamed'(以及'WithElementsKeyed')方法,所以我們不必爲各種註冊類型創建'RegisterComposite'的重載(這不是任何註冊類型其他註冊方法對於命名/鍵控類型)。 – 2011-03-01 15:41:20