代码之家  ›  专栏  ›  技术社区  ›  mwjackson

带C#接口的nHibernate(带Castle ActiveRecord)(尤其适用于DTO)

  •  3
  • mwjackson  · 技术社区  · 16 年前

    任何将nHibernate与域对象一起使用&从公共接口实现的DTO对象?我试图将所有的nHibernate属性分离到域对象中,使DTO和接口保持干净。

    当nHibernate试图将接口与具体类相关联时,它会抛出错误。

    我理解为什么它抱怨使用非休眠界面,但我正在努力寻找一种可视化的方法来重新构建它。我的代码的骨架复制如下所示,关于如何更好地构造我的代码,有什么想法吗?

    public interface ICompany
    {
        IList<IContact> Contacts { get; set; }
    }
    
    public class CompanyDTO : ICompany
    {
        private IList<IContact> contacts;
        public IList<IContact> Contacts { get { return this.contacts; } set { this.contacts = value; } }
    
    }
    
    [ActiveRecord]
    public class Company : ActiveRecordBase<Company>, ICompany
    {
        private IList<IContact> contacts;
        [HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId")] 
        [ScriptIgnore]
        public IList<IContact> Contacts { get { return this.contacts; } set { this.contacts = value; } }
    }
    

    编辑:

    我希望有一个公共接口,这样我可以确保它们保持相同的字段(即依靠编译器保持一致)。它还允许我在应用程序的视图部分使用DTO,但将它们强制转换到域对象以进行业务和数据访问。

    3 回复  |  直到 16 年前
        1
  •  4
  •   mookid8000    16 年前

    Type = typeof(Contact) 到映射属性,如下所示:

    [HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId", Type=typeof(Contact))]
    
        2
  •  0
  •   alexl    16 年前

    在您的域中,您不能使用IContract来引用您的域实体,而是使用具体类。如果要更正您的版本,只需使用以下命令:

    [ActiveRecord]
    public class Company : ActiveRecordBase<Company>
    {
        private IList<Contact> contacts;
        [HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId")] 
        [ScriptIgnore]
        public IList<Contact> Contacts { get { return this.contacts; } set { this.contacts = value; } }
    }
    

    可以使用基类定义实体和ValueObject。简言之,实体:DomainEntity可标识意味着它们可以持久化。ValueObject=DTO无法持久化(不支持ID)

    请看锐利拱门的核心设计:

    • /BaseObject.cs:提供基本的对象比较服务。
    • /Entity.cs:提供具有域的对象 签名和可键入的ID属性。这也得到了验证 必须至少有一个[DomainSignature]属性;它会抛出一个 如果违反此规定,则合同设计例外。接口
    • /ValueObject.cs:这是一个值对象,其中所有 当与另一个值对象进行比较时,将使用属性。物体 从ValueObject扩展的可能没有任何[DomainSignature] 性质;如果是,它将抛出契约设计异常
        3
  •  0
  •   Jérôme Verstrynge    13 年前

    使现代化

    答案是使用 CollectionType = typeof(YourType)

    更新2

    不,它不工作,此属性是为集合类型设置的,即列表等。 试图设置[HasMany(typeof(meType),…]),但仍然不起作用。