【问题标题】:Define default constructor with StructureMap without providing arguements or using DefaultConstructor attribute使用 StructureMap 定义默认构造函数,而不提供争论或使用 DefaultConstructor 属性
【发布时间】: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


    【解决方案1】:

    我找到了解决办法,但“魔法”有点臭:

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

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

    【讨论】:

    • 哪个类实现了 IBusinessUnitRepository?如果您对它的工作方式有任何建议,请发布到 StructureMap 邮件列表。 groups.google.com/group/structuremap-users
    • Joshua,BusinessUnitRepository 实现了 IBusinessUnitRepository。
    猜你喜欢
    • 2010-09-22
    • 2010-09-17
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2011-04-17
    相关资源
    最近更新 更多