簡體   English   中英

可以使用溫莎城堡IOC容器注冊代表嗎?

[英]Can delegates be registered with Castle Windsor IOC container?

這可能是一個愚蠢的問題,但是可以在IOC容器(例如溫莎)中注冊代表或事件嗎?

我打算在應用程序啟動時注冊事件功能,以實現策略模式。

我認為,另一種選擇是簡單地將所有代表包裝成類型以在容器中注冊。

無需包裝或子類化函數即可在Windsor中注冊它們。 它們的工作原理與其他任何組件一樣。 如果您需要將一個Func<int>與另一個Func<int> ,請使用命名組件和服務替代,就像其他任何組件一樣。 例:

[Test]
public void Example() {
    var container = new DefaultKernel();
    container.Register(Component.For<Func<int>>().Instance(() => 42).Named("42"));
    container.Register(Component.For<Func<int>>().Instance(() => 44).Named("44"));
    container.Register(Component.For<Something>().DependsOn(ServiceOverride.ForKey("f").Eq("44")));
    var s = container.Resolve<Something>();
    Assert.AreEqual(44, s.I);
}

class Something {
    private readonly int i;
    public Something(Func<int> f) {
        i = f();
    }

    public int I {
        get { return i; }
    }
}

如果您希望使用容器取消事件注冊的耦合,請使用事件接線工具

我說這是不可能的,因為您將如何解決依賴性?

如果一個類要求一個Func<bool>類型的委托,那么您如何區分不同的委托?

封裝委托的替代方法是最好的解決方案,因為它允許您命名委托並將其組合為功能部分。

編輯結果溫莎城堡(Castle Windsor)具有一種在IOC中注冊實例的命名方式。 因此有可能,但是您仍然需要為每個實例指定某種名稱。 請參閱Mauricio Scheffer的答案

如前所述,它工作得很好,如果使用類型化的工廠設施 ,請小心,因為它可能會出現一些意外的行為。 您的委托依存關系可能會產生代理工廠的創建。 看到這個問題

暫無
暫無

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

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