使用StructureMap定义默认构造函数,而不提供参数或使用DefaultConstructor属性

时间:2009-07-12 18:26:22

标签: .net linq-to-sql structuremap

我一直在使用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

仅供参考:

  • 如果我在Repository.LinqToSql.BusinessUnitRepository程序集中引用StructureMap并使用我的IDatabaseFactory构造函数上的[DefaultConstructor]属性,那么一切都很完美。
  • 我也确认StructureMap确实包含已配置的'Repository.LinqToSql.DatabaseFactory'

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,但'魔术'有一个臭:

ForRequestedType<Repository.IBusinessUnitRepository>()
            .CacheBy( InstanceScope.PerRequest )
            .TheDefault.Is.OfConcreteType<BusinessUnitRepository>()
            .CtorDependency<IDatabaseFactory>("factory").IsTheDefault();

SelectConstructor<BusinessUnitRepository>( () => new BusinessUnitRepository((IDatabaseFactory)null ) );

我仍然认为有更好的答案。由于我有很多Repository接口和具体实现,因此为每种类型定义SelectConstructor似乎需要做很多工作。我愿意接受建议。