2014-03-12 100 views
1

只要我爲使用泛型的接口設置規則,就很難處理。例如,這工作(對於一個簡單的界面)設置使用泛型的接口的構造函數參數

  // Imagine this interface 
      public interface ISearchProvider. 

      // Easy to set up with constructor parameters 
      x.For<ISearchProvider>() 
       .HybridHttpOrThreadLocalScoped() 
       .Use<CatalogueSearchProvider>() 
       .Ctor<bool>("recreateDb").Is(false) 
       .Ctor<string>("connectionString").Is(catalogConnString); 

與此比較:

// Now this interface (that use generics) 
public interface IRepo<T> : IRepo<T> where T : IEntity 

如果我想使用相同的設置,我必須使用「typeof運算」和而不同structuremap方法,缺乏設置構造函數參數的可能性。

  x.For(typeof(IRepo<>)) 
       .HybridHttpOrThreadLocalScoped() 
       .Use(typeof(MyRepo<>) 
       .Ctor <-- doesn't exist! 
       ); 

我可以找到沒有等價物,是否有任何?

回答

0

不是將原始類型注入到泛型類型的構造函數中,而是將這些信息提取到單獨的(非泛型)抽象中。通過這種方法,您甚至可以防止首先使用脆弱的.Ctor方法調用。

例如:

public class MyRepo<T> : IRepo<T> { 
    private readonly IConnectionFactory connectionFactory; 
    public MyRepo(IConnectionFactory connectionFactory) { 
     this.connectionFactory = connectionFactory; 
    } 
} 

隨着以下配置:

x.For(typeof(IConnectionFactory)) 
    .Singleton() 
    .Use(new ConnectionFactory(false, catalogConnString)); 

x.For(typeof(IRepo<>)) 
    .HybridHttpOrThreadLocalScoped() 
    .Use(typeof(MyRepo<>)); 

問題解決:-)

PS。請注意,Per Thread Lifestyle is Considered Harmful。您應該使用有限範圍的生活方式。

0

它實際上非常相似,只是方法調用在非泛型調用上被命名爲不同。我仔細檢查過,它與開放式仿製藥一起使用。

因此,對於你的例子中,你將有:

x.For(typeof(IRepo<>)) 
      .HybridHttpOrThreadLocalScoped() 
      .Use(typeof(MyRepo<>) 
      .CtorDependency<bool>("recreateDb").Is(false) 
      .CtorDependency<string>("connectionString").Is(catalogConnString); 
相關問題