سؤال

أي باستخدام nHibernate مع كائن المجال & DTO يعترض تنفيذها من واجهة مشتركة?أنا أحاول أن أفصل كل nHibernate الصفات إلى كائن المجال ، وترك بلدي DTO و واجهة نظيفة.

المشكلة تأتي مع nHibernate رمي أخطاء عند محاولة ربط الواجهات مع فئات محددة.

NHibernate.MappingException:جمعية المراجع تفاصيلها الدرجة:IContact

أنا أفهم لماذا تشكو استخدام غير مسبوت واجهة, ولكن أنا تكافح من أجل البصرية وسيلة لإعادة هيكلة حوله.الهيكل العظمي النسخ من الرمز المبين أدناه ، أي أفكار عن كيفية تنظيم قانون بلدي أفضل ؟

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; } }
}

تحرير:

كنت تريد أن يكون لها واجهة مشتركة بحيث لا يمكن ضمان الحفاظ على نفس الحقول (ie.متوكئا على المترجم للحفاظ على ثابت).كما يسمح لي أن استخدام DTO في عرض جزء من التطبيق ، ولكن يلقي لهم كائنات المجال لرجال الأعمال الوصول إلى البيانات.كما أليكس لا يعمل الحل لأن ICompany اتصالات من نوع IList لا IList.أود أن يبقيه كما IContact لذا DTO كائن لا علم الاتصال كائن المجال.

هل كانت مفيدة؟

المحلول

في الخرسانة الحالة يجب عليك فقط إضافة Type = typeof(Contact) إلى تعيين السمة مثل:

[HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId", Type=typeof(Contact))]

نصائح أخرى

في المجال الخاص بك لا يمكنك استخدام 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; } }
}

أنا لا أرى فائدة من واجهة المجال الخاص بك والخاص بك DTOs.وبالإضافة إلى ذلك ، يمكن أن يكون لا نفس المعلومات.على سبيل المثال هل يمكن أن نأخذ بعض المعلومات جدا weel مغلفة في المجال الخاص بك و التواصل فقط عدد قليل آخر من المعلومات.DTO إلى transfert البيانات التي تريد مشاركتها مع طبقات.

هل يمكن أن يكون قاعدة الطبقة لتحديد كيان و ValueObject.باختصار الكيان :DomainEntity هي معرف على ما يعني أنها يمكن أن تكون موجودة.ValueObject = DTO لا يمكن أن تكون موجودة (غير معرف على)

نظرة على التصميم الأساسية من حاد القوس:

  • /BaseObject.cs:يوفر الأساسية وجوه المقارنة الخدمات.
  • /الكيان.cs:يوفر كائن مع المجال التوقيع و typeable ID الملكية.هذا أيضا التحقق من صحة دعم NHibernate المصادقة.الكائنات التي تمتد من الكيان يجب أن يكون لديك واحد على الأقل [DomainSignature] الممتلكات ؛ سوف رمي التصميم عن طريق عقد الاستثناء إذا كان هذا هو انتهكت.واجهة IEntityWithTypedID يسمح لك لفة الخاص بك.
  • /ValueObject.cs:هذه هي قيمة الكائن فيه كل من خصائص تستخدم عند مقارنة إلى آخر قيمة الكائن.الكائنات التي تمتد من ValueObject قد لا يكون أي [DomainSignature] خصائص.سوف رمي التصميم عن طريق عقد الاستثناء إذا كان هذا هو انتهكت.

وماذا يجب علي أن أفعل إذا كان لدي [HasMany] الخاصية ؟ فإنه في الواقع لم الملكية اسم 'نوع', ولكن [الملكية] و [BelongsTo] منها.

التحديث

الجواب هو استخدام CollectionType = typeof(YourType)

تحديث 2

لا, أنها لا تعمل ، يتم تعيين هذه الخاصية على جمع أي نوعقائمة الخ.محاولة تعيين [HasMany(typeof(meType), ...)] ولكن لا يزال لا يعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top