【发布时间】:2009-11-11 00:06:27
【问题描述】:
我已经使用 StructureMap 有一段时间了,但我远非专家。我的问题很简单,我试图通过代码(注册表)配置 SM,以便在创建存储库对象的实例时使用特定的构造函数。
这是我的 2 个构造函数(请注意,它们都不是最贪婪的)。
public BusinessUnitRepository( IDatabase database )
: base( database ) {
}
public BusinessUnitRepository( IDatabaseFactory factory )
: base( factory ) {
}
注意:第一个构造函数采用IDatabase 接口的实例,并由基类的ctor(IDatabaseFactory) 实现调用。
我要做的是将 SM 配置为使用第二个构造函数并从 SM 容器中提供DatabaseFactory 的实例。我不能在定义了BusinessUnitRepository 的程序集中使用[DefaultConstructor] 属性,因此该选项不在讨论范围内。
我的注册表代码
ForRequestedType<IDatabaseFactory>()
.CacheBy( InstanceScope.PerRequest )
.TheDefaultIsConcreteType<DatabaseFactory>();
ForRequestedType<Repository.IBusinessUnitRepository>()
.CacheBy( InstanceScope.PerRequest )
.TheDefault.Is.OfConcreteType<BusinessUnitRepository>().CtorDependency<IDatabaseFactory>().Is<DatabaseFactory>();
当我运行程序时,SM 在尝试创建 BusinessUnitRepository 的实例时抛出 302 错误。
StructureMap.StructureMapException: StructureMap Exception Code: 302
There is no argument of type Repository.LinqToSql.IDatabaseFactory for concrete type Repository.LinqToSql.BusinessUnitRepository
仅供参考:
- 如果我在 Repository.LinqToSql.BusinessUnitRepository 程序集中引用 StructureMap 并在我的 IDatabaseFactory 构造函数上使用 [DefaultConstructor] 属性,一切都会完美运行。
- 我还确认 StructureMap 确实包含配置的“Repository.LinqToSql.DatabaseFactory”
【问题讨论】:
标签: .net linq-to-sql structuremap