2012-05-15 39 views
3

我有一個通用的接口:StructureMap和泛型 - 如何指定默認構造函數?

public interface IRepository<T> { ... } 

我有一個這樣的實施方式:

public class Repository<T> { 
    public Repository<T>() { ... } 
} 

StructureMap(V 2.6.3)被配置是這樣的:

For(typeof(IRepository<>)).Use(typeof(Repository<>)); 

當我嘗試從StructureMap中抽取IRepository<Something>,我按預期得到Repository<Something>Hooray!

現在,我已經添加了第二個構造函數和實施看起來是這樣的:

public class Repository<T> { 
    public Repository<T>() { ... } 
    public Repository<T>(string database) { ... } 
} 

當我嘗試,並得到一個IRepository<Something>現在,我得到一個例外,因爲它默認爲嘗試使用新帶參數的構造函數。 噓!

我怎樣才能改變我的StructureMap配置,以便它知道要使用參數的構造函數?

回答

5

您可以通過標記你想StructureMap與[缺省構造函數]屬性使用構造實現這一目標。正如你在StructureMap documentation上看到的那樣,它默認情況下是貪婪的。

+0

是啊,我發現,解決辦法......不過,我不希望有改變我的庫類,除非我真的要。將實現緊密結合到特定的IOC容器似乎很奇怪。 – NeilD

+2

對於開放的泛型類型,沒有辦法做到這一點。作爲討厭的雜物,你可以使用CtorDependency來傳遞默認值,例如。x.For(typeof運算(IRepository <>))使用(typeof運算(存儲庫<>))CtorDependency ( 「數據庫」)是(空);然後相應地處理它。什麼是數據庫字符串用於爲什麼你不想你的容器來實現它? –

+0

非常有幫助,感謝羅布:) –