1

我已经使用 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”
4

1 回答 1

0

我找到了一个解决方案,但“魔法”很臭:

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

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

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

于 2009-07-13T01:15:53.210 回答