簡體   English   中英

Autofac復合模式

[英]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 的工廠方法可能有效。

復合配准將在 AutoFac 6.0 中出現

它不會自動為您創建復合材料,但它會

  • 將接口的所有其他實現注入到組合中
  • 將復合注冊為默認接口實現
  • 不解析IEnumerable<Interface>分辨率中的復合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM