Structuremap 结构图-我不想使用最贪婪的构造函数!

Structuremap 结构图-我不想使用最贪婪的构造函数!,structuremap,Structuremap,我正试图在我的项目中用结构图配置NCommonNHRepository。如何阻止它选择最贪婪的构造函数 public class NHRepository<TEntity> : RepositoryBase<TEntity> { public NHRepository () {} public NHRepository(ISession session) { _privateSession = session;

我正试图在我的项目中用结构图配置NCommonNHRepository。如何阻止它选择最贪婪的构造函数

 public class NHRepository<TEntity> : RepositoryBase<TEntity>
 {

    public NHRepository () {}


    public NHRepository(ISession session)
    {
        _privateSession = session; 
    }

    ...
}
公共类存储库:RepositoryBase
{
公共存储库(){}
公共存储库(ISession会话)
{
_私密会话=会话;
}
...
}
我的结构图配置

ForRequestedType(typeof (IRepository<>))
                .TheDefaultIsConcreteType(typeof(NHRepository<>))
ForRequestedType(typeof(IRepository))
.默认混凝土类型(类型(NHRepository))
干杯
Jake

您可以为希望作为默认值的构造函数设置
[DefaultConstructor]
属性。在您的情况下,在
NHRepository()
构造函数上设置它将使其成为StructureMap初始化的默认构造函数

更新:在最新版本的StructureMap中,使用.NET 3.5还可以使用SelectConstructor方法指定它:

var container = new Container(x =>
{
  x.SelectConstructor<NHRepository>(()=>new NHRepository());
});
var容器=新容器(x=>
{
x、 选择构造函数(()=>newnhrepository());
});

最后,我相信您可以在StructureMap的XML配置中定义它,但我还没有使用它。你可以在上面搜索一下。有关上述方法的更多信息,请参阅:

So+1 For Razzie,因为如果NHRepository在我自己的程序集中,这将起作用,而我选择用我自己的存储库包装NHRepository,如下所示

public class Repository<T> : NHRepository<T>
{
    [DefaultConstructor]
    public Repository()
    {

    }

    public Repository(ISession session)
    {

    }
}

ForRequestedType(typeof (IRepository<>))
                .TheDefaultIsConcreteType(typeof (Repository<>));
公共类存储库:NHRepository
{
[默认构造函数]
公共存储库()
{
}
公共存储库(ISession会话)
{
}
}
ForRequestedType(typeof(IRepository))
。默认混凝土类型(类型(存储库));

Hi Razzie,为答案欢呼,但是NHRepository位于ncomon.NHibernate.dll中,我无法更改。所以我应该在我的项目中继承NHRepository,并将属性放在它的构造函数上吗?我没有想到这一点。请参阅我更新的答案以使用SelectConstructor方法,但这仅在.NET 3.5中可能,而且我仍然不确定如何使用该语法,因为我认为编译器将不允许var container=new container(x=>{x.SelectConstructor(()=>new NHRepository();});所以我还需要知道如何做到这一点:(你需要.NET3.5,正如我在文章中所说的。你可能正在运行2.0吗?如果是的话,是时候升级了:-)是的,兄弟,我在使用.NET3.5,问题是NHRepository是一个通用的,比如NHRepository等等。所以上面的语法无法编译。如果您查看我的原始配置,您会注意到我必须使用typeof(IRepository)语法。所以我认为structor map在fluent配置中不支持这一点。除非我强制所有实体实现IEntity,否则我可以使用x.SelectConstructor(()=>new NHRepository());-但我真的不确定这是否有效