【问题标题】:Structure Map - I dont want to use the greediest constructor!结构图 - 我不想使用最贪婪的构造函数!
【发布时间】:2009-07-02 11:13:56
【问题描述】:

我正在尝试使用 Structure Map 在我的项目中配置 NCommon NHRepository。如何阻止它选择最贪婪的构造函数?

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

    public NHRepository () {}


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

    ...
}

我的结构图配置

ForRequestedType(typeof (IRepository<>))
                .TheDefaultIsConcreteType(typeof(NHRepository<>))

干杯 杰克

【问题讨论】:

    标签: structuremap


    【解决方案1】:

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

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

    var container = new Container(x =>
    {
      x.SelectConstructor<NHRepository>(()=>new NHRepository());
    });
    

    最后,我确信您可以在 StructureMap 的 XML 配置中定义它,但我没有使用过。您可以对其进行一些搜索。更多关于上述方法的信息,请参见:http://structuremap.sourceforge.net/ConstructorAndSetterInjection.htm#section3

    【讨论】:

    • 嗨 Razzie,为答案欢呼,但是 NHRepository 位于 NCommon.NHibernate.dll 中,我无法更改。那么我应该只从项目中的 NHRepository 继承,然后将属性放在其构造函数上吗?
    • 我没想到。请参阅我更新的答案以使用 SelectConstructor 方法,但这只能在 .NET 3.5 中实现
    • 另外我仍然不确定如何使用该语法,因为编译器不允许 var container = new Container(x => { x.SelectConstructor>(() => new NHRepository()); });所以我还需要知道如何做到这一点:(
    • 您需要 .NET 3.5,如我的帖子中所述。您是否正在运行 2.0?如果是这样,是时候升级了:-)
    • 是的,兄弟,我使用的是 .net 3.5,问题是 NHRepository 是一个泛型,如 NHRepository 等。所以上述语法无法编译。如果您查看我的原始配置,您会注意到我必须使用 typeof (IRepository) 语法。所以我不认为 structor map 在流畅的配置中支持这一点。除非我强制所有实体实现 IEntity,否则我可以使用 x.SelectConstructor>(()=>new NHRepository()); - 但我真的不确定这是否会起作用
    【解决方案2】:

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

    public class Repository<T> : NHRepository<T>
    {
        [DefaultConstructor]
        public Repository()
        {
    
        }
    
        public Repository(ISession session)
        {
    
        }
    }
    
    ForRequestedType(typeof (IRepository<>))
                    .TheDefaultIsConcreteType(typeof (Repository<>));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-09
      • 2014-09-06
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多