如何使用StructureMap在代码中定义默认构造函数?

16

我不知道如何在StructureMap(版本2.5)中编写代码来定义类型的默认构造函数(当它存在重载时)。

我想要获取一个服务实例,容器必须将Linq2Sql数据上下文实例注入其中。

我在我的“启动文件”方法中编写了以下代码:

ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>();
当我运行我的应用程序时,我遇到了这个错误:

StructureMap异常代码:202
PluginFamily MyNamespace.Data.SqlRepository.MyDataContext,MyNamespace.Data,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null的默认实例未定义

如果我注释掉所有我不需要的Linq2Sql生成的构造函数,它就能正常工作。
更新:哦,我忘了说我不会使用[StructureMap.DefaultConstructor]属性。
3个回答

31
你可以使用 ConstructedBy() 指定一个构造函数。请尝试以下代码:
```html

您可以使用 ConstructedBy() 方法指定一个构造函数。请尝试以下代码:

```
ForRequestedType<MyDataContext>().TheDefault.
Is.ConstructedBy(() => new MyDataContext());

这对我有用。


24
SM 2.6 语法更新:For<MyDataContext>().Use(() => new MyDataContext())。翻译完成,没有其他返回。 - mxmissile
1
在SM 2.6.2中,似乎Use没有任何构造函数参数。 - Ryan Tomlinson
在SM 2.6.4.1中测试通过:对于<IFoo>()。Use(() => new Foo()); - Fernando Correia

5

如果您正在使用Linq2Sql,我认为您还需要设置对象的生命周期(InstanceScope)。建议使用这段代码,因为它可以给您更多的灵活性。

ForRequestedType< MyDataContext >()
            .CacheBy( InstanceScope.PerRequest )
            .TheDefault.Is.OfConcreteType< MyDataContext >()

SelectConstructor< MyDataContext >( () => new MyDataContext());

使用这段代码,您还可以进一步将接口定义注入到MyDataContext构造函数中,就像这样:
SelectConstructor< MyDataContext >( () => new MyDataContext((IDatabaseFactory)null ));

记得使用StructureMap为您的IDatabaseFactory实例定义具体类型。


0

我不确定如何/是否可以使用流畅的接口/内部DSL完成。但是,如果您不介意“污染您的域”,则可以使用属性。

使用[DefaultConstructor]标记您首选的构造函数。StructureMap默认按惯例选择最贪婪的构造函数(具有最多参数的构造函数)。


抱歉Cik,你更新时我已经打了(但未提交)我的回复。 - Ed Blackburn
没问题,是我的错;-) 无论如何感谢您的回复!在创建部分类时注释我的DataContext的方法是可行的,但我认为这样做会失去使用IoC的好处... - Cyril Bioley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接