سؤال

لدي نموذج مجال جهل ثبات يستخدم مستودعات مجردة لتحميل كائنات المجال. يستخدم التنفيذ الملموس لمستودعي (طبقة الوصول إلى البيانات (DAL)) إطار عمل الكيان لجلب البيانات من قاعدة بيانات SQL Server. تحتوي قاعدة البيانات على قيود طول على الكثير من أعمدة Varchar. تخيل الآن أن لدي فئة المجال التالية:

public class Case
{
    public Case(int id, string text)
    {
         this.Id = id;
         this.Text = text;
    }

    public int Id { get; private set; }
    public string Text { get; set; }
}

ومستودع تجريدي محدد على النحو التالي:

public abstract class CaseRepository
{
    public abstract void CreateCase(Case item);
    public abstract Case GetCaseById(int id);
}

ال [text] يتم تعريف عمود الجدول في SQLServer على أنه nvarchar(100)

الآن أعلم أنني ذكرت أن فصل النطاق الخاص بي (Case) هل كان الجهل الثابت ، ومع ذلك أشعر أنه من الخطأ أنه يسمح بقيم text المعلمة التي لا يمكن حفظها في نهاية المطاف من خلال تنفيذ مستودع الخرسانة لأن إطار الكيان سوف يرمي استثناء عند تعيين text خاصية إلى إطار الكيان الذي تم إنشاؤه عندما يكون أطول من 100 حرف. لذلك قررت أنني أرغب في التحقق من هذا القيد في نموذج المجال ، لأن هذا يسمح لي بالتحقق من صحة البيانات قبل محاولة نقله إلى DAL ، وبالتالي جعل الخطأ الإبلاغ أكثر تركزًا على كائن المجال. أظن أنه يمكنك القول أنه يمكنني فقط التحقق من القيد في مُنشئي وفي جهاز Propert

الآن ، الشيء الذي توصلت إليه هو فصل يسمى ConstrainedString, ، محددة على النحو التالي:

public abstract class ConstrainedString
{
    private string textValue;

    public ConstrainedString(uint maxLength, string textValue)
    {
        if (textValue == null) throw new ArgumentNullException("textValue");
        if (textValue.Length > maxLength) 
            throw new ArgumentException("textValue may not be longer than maxLength", "textValue");

        this.textValue = textValue;
        this.MaxLength = maxLength;
    }

    public uint MaxLength { get; private set; }

    public string Value 
    { 
        get 
        {
            return this.textValue;
        } 

        set 
        {
            if (value == null)
                throw new ArgumentNullException("value");
            if (value.Length > this.MaxLength) throw new ArgumentException("value cannot be longer than MaxLength", "value");
            this.textValue = value;
        } 
    }
}

علاوة على ذلك ، لدي تطبيق ConstrainedString اتصل String100 :

public class String100 : ConstrainedString
{
    public String100(string textValue) : base(100, textValue) { }
}

وبالتالي يؤدي إلى تنفيذ مختلف ل Case هذا سيبدو هكذا:

public class Case
{
    public Case(int id, String100 text)
    {
         this.Id = id;
         this.Text = text;
    }

    public int Id { get; private set; }
    public String100 Text { get; set; }
}

الآن ، سؤالي هو ؛ هل أطل على بعض الفصول المضمنة أو بعض النهج الأخرى التي يمكنني استخدامها بدلاً من ذلك؟ أم أن هذا نهج معقول؟

أي تعليقات واقتراحات موضع ترحيب كبير.

شكرا لكم مقدما

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

المحلول

قد يكون هذا هو الرمز الذي تبحث عنه: giveacodicetagpre.

نصائح أخرى

أعتقد أن هذا يعتمد على العديد من العوامل (وكذلك بعض التفضيلات الشخصية). في بعض الأحيان ، يجب أن يشكل القيد جزءًا من كائن المجال - على سبيل المثال مع أرقام الضمان الاجتماعي/أرقام جوازات السفر ... - عادةً ما يكون لها طول ثابت ولا يمكن أن تختلف كقاعدة مجال - وليس قاعدة استمرار البيانات (على الرغم من أنك قد تقيد DB كذلك).

يفضل البعض ألا يكون لديهم هذا النوع من عمليات الفحص في نموذج المجال الخاص بهم ، وبدلاً من ذلك ، لديهم ما يشبه سمة التحقق من الصحة على الممتلكات التي يمكن تفتيشها وتنفيذها خارجيًا من كائن المجال بواسطة مصلحة منفصلة.

المشكلة التي قد تواجهها مع طريقتك (على الرغم من أنه ليس من الصعب الالتفاف) الحصول على أي ORM/MAPPER - إذا كنت تستخدم واحدة - لمعرفة كيفية تعيين سلسلة من/من DB إلى محدودة الخاص بك.

قد لا يتغلب المقيمون

إذا قمت بتغيير قيود القضية ، فمن المنطقي أنه يتعين عليك إنشاء واحدة جديدة - لقد قمت بتغيير العقد ، ولن يعرف الكود القديم ما إذا كان يفي بالمتطلبات أم لا.

بدلاً من القلق بشأن ما سيسمح به مستودعك أو لا يسمح به ، حدد ماذا أنت سيسمح في صفك ، وتأكد من أن تجد طريقة للعمل مع أي مستودع تتغير إليه في المستقبل. أنت تملك واجهة برمجة التطبيقات الخاصة بك - تبعياتك لا.

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