2012-05-15 35 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

非常有帮助,感谢罗布:) –