我一直在使用StructureMap,但我远非专家。我的问题很简单,我正在尝试通过代码(Registry)配置SM,以便在创建存储库对象的实例时使用特定的构造函数。
这是我的2个构造函数(注意两者都不是最贪婪的)。
public BusinessUnitRepository( IDatabase database )
: base( database ) {
}
public BusinessUnitRepository( IDatabaseFactory factory )
: base( factory ) {
}
注意:第一个构造函数接受IDatabase
接口的实例,并由基类的ctor(IDatabaseFactory)实现调用。
我要做的是配置SM使用第二个构造函数,并从SM容器中提供DatabaseFactory
的实例。我无法在已定义[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
的实例时抛出302错误。
StructureMap.StructureMapException: StructureMap Exception Code: 302
There is no argument of type Repository.LinqToSql.IDatabaseFactory for concrete type Repository.LinqToSql.BusinessUnitRepository
仅供参考:
答案 0 :(得分:0)
我找到了一个解决方案,但'魔术'有一个臭:
ForRequestedType<Repository.IBusinessUnitRepository>()
.CacheBy( InstanceScope.PerRequest )
.TheDefault.Is.OfConcreteType<BusinessUnitRepository>()
.CtorDependency<IDatabaseFactory>("factory").IsTheDefault();
SelectConstructor<BusinessUnitRepository>( () => new BusinessUnitRepository((IDatabaseFactory)null ) );
我仍然认为有更好的答案。由于我有很多Repository接口和具体实现,因此为每种类型定义SelectConstructor
似乎需要做很多工作。我愿意接受建议。