0

雖然我之前在溫莎城堡中使用泛型,但是這種特殊的組合方式目前讓我難倒了。在具有繼承和無接口的城堡中解決泛型構造函數參數

我想解決它作爲一個構造函數參數,它是通過顯式調用resolve()在單元測試中模擬的。

但我無法弄清楚需要註冊和解決什麼樣的組合。 我在下面的代碼中顯示一個失敗的測試,以清除問題。

public abstract class BaseSettings<T> where T : class 
    { 
     protected void Save(T obj) 
     { } 
    } 

    public class AddinSettings : BaseSettings<AddinSettings> 
    { } 

    public class OtherSettings : BaseSettings<OtherSettings> 
    { } 

    public class LogConfig<T> where T : class 
    { 
     private readonly BaseSettings<T> _client; 

     public LogConfig(BaseSettings<T> client) 
     { 
      _client = client; 
     } 

     public BaseSettings<T> Client 
     { 
      get { return _client; } 
     } 
    } 

    [Test] 
    public void resolve_generics() 
    { 
     var container = new WindsorContainer(); 
     container.Register(Component.For<OtherSettings >()); 
     var otherSettings = container.Resolve<LogConfig<OtherSettings>>(); 
     Assert.That(otherSettings, Is.Not.Null); 
    } 

回答

3

首先,需要像@Marwijn那樣註冊一個開放的泛型類型LogConfig<>

然後,您可以通過使用BasedOn(typeof(BaseSettings<>))WithService.Base()選擇base type/conditionservice for the component的方式登記所有BaseSettings<T>實現。

下面的測試方法證明了這一點:

[TestMethod] 
public void resolve_generics() 
{ 
    // arrange 
    var container = new WindsorContainer(); 
    container.Register(
     Component.For(typeof(LogConfig<>)), 
     Classes.FromThisAssembly().BasedOn(typeof(BaseSettings<>)).WithService.Base()); 

    //act 
    var otherSettings = container.Resolve<LogConfig<OtherSettings>>(); 
    var addinSettings = container.Resolve<LogConfig<AddinSettings>>(); 

    // assert 
    otherSettings.Should().NotBeNull(); 
    otherSettings.Client.Should().BeOfType<OtherSettings>(); 

    addinSettings.Should().NotBeNull(); 
    addinSettings.Client.Should().BeOfType<AddinSettings>(); 
} 

上有類似的問題有關registering types based on base class另一個答案。

+1

好的改進。感謝我不知道這是基於開放式仿製藥的作品。 – Marwijn

+0

神奇的是,這就是我需要的 – PandaWood

0

你可以試試這個:

container.Register(
    Component.For(typeof(LogConfig<>)), 
    Component.For<BaseSettings<OtherSettings>>().ImplementedBy<OtherSettings>()); 

古德勒克, Marwijn。