[英]Autofac composite pattern
我注意到我經常需要實現復合模式。 例如:
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 中的Decorators by Hand
可以改進嗎?
我還沒有實現這一點,甚至沒有完全考慮過,但我能實現的最佳語法是:
builder
.RegisterComposite<IService>((c, elements) => new CompositeService(elements))
.WithElementsNamed("impl");
注冊函數的elements
參數將是IEnumerable<IService>
類型並封裝c.Resolve<IEnumerable<IService>>("impl")
。
現在怎么寫...
您可以嘗試命名或鍵控注冊。 命名注冊只是獲取一個字符串名稱,以將其與同一接口的其他注冊區分開來。 類似地,鍵使用某種值類型(例如枚舉)來區分多個注冊。 您的 CompositeService 可能是默認引用,按類型注冊,不需要其他特殊信息。 您需要一些方法來解析其他 IService 依賴項並將它們傳遞給構造函數; CompositeService 的工廠方法可能有效。
它不會自動為您創建復合材料,但它會
IEnumerable<Interface>
分辨率中的復合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.