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]属性。

4

3 回答 3

31

您可以使用 ConstructedBy() 指定构造函数。请试试这个:

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

这对我有用。

于 2008-11-18T10:35:13.080 回答
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 实例定义具体类型。

于 2010-03-13T04:11:05.777 回答
0

我不确定如何/是否可以使用流畅的接口/内部 DSL 来完成。但是,如果您不担心污染您的域,您可以使用属性吗?

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

于 2008-11-14T09:14:38.393 回答