我已经使用 StructureMap 有一段时间了,但我远非专家。我的问题很简单,我试图通过代码(注册表)配置 SM,以便在创建存储库对象的实例时使用特定的构造函数。
这是我的 2 个构造函数(请注意,它们都不是最贪婪的)。
public BusinessUnitRepository( IDatabase database )
: base( database ) {
}
public BusinessUnitRepository( IDatabaseFactory factory )
: base( factory ) {
}
注意:第一个构造函数采用IDatabase
接口的一个实例,并由基类的 ctor(IDatabaseFactory) 实现调用。
我要做的是将 SM 配置为使用第二个构造函数并提供DatabaseFactory
来自 SM 容器的实例。我不能[DefaultConstructor]
在程序集中使用定义的属性,BusinessUnitRepository
所以这个选项不在讨论范围内。
我的注册表代码
ForRequestedType<IDatabaseFactory>()
.CacheBy( InstanceScope.PerRequest )
.TheDefaultIsConcreteType<DatabaseFactory>();
ForRequestedType<Repository.IBusinessUnitRepository>()
.CacheBy( InstanceScope.PerRequest )
.TheDefault.Is.OfConcreteType<BusinessUnitRepository>().CtorDependency<IDatabaseFactory>().Is<DatabaseFactory>();
当我运行程序时,SM 在尝试创建BusinessUnitRepository
.
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”