定义与StructureMap默认构造函数不提供arguements或使用缺省构造函数属性(Defi

2019-09-18 10:11发布

我一直在使用StructureMap了一段时间,但现在我根本不是一个专家。 我的问题很简单,我想通过代码(注册)来配置SM创建一个存储库对象的实例时使用特定的构造函数。

这里是我的2层构造(注既不是贪婪)。

public BusinessUnitRepository( IDatabase database )
    : base( database ) {

}

public BusinessUnitRepository( IDatabaseFactory factory )
    : base( factory ) {

}

注:第一个构造函数将实例IDatabase接口,并通过基类的构造函数(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抛出试图创建的实例时302错误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构造一切完美。
  • 此外,我已经证实,StructureMap确实包含一个配置“Repository.LinqToSql.DatabaseFactory”

Answer 1:

我发现了一个解决方案,但“魔力”有臭味:

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

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

我仍然认为这是一个更好的答案。 因为我有好几个版本库接口和具体实现它似乎是一个大量的工作来定义SelectConstructor每种类型。 我很开放的建议。



文章来源: Define default constructor with StructureMap without providing arguements or using DefaultConstructor attribute