سؤال

أنا جديد على Nibernate (و Orms) ومحاولة المجيء إلى القبض على عدد لا يحصى من الخيارات المختلفة التي تقدمها. للرجوع اليها، أنا أستخدم أحمق بطلاقة مع كائنات أعمال منفصلة والتي بدورها استخدم DTO بحتة للوصول إلى البيانات. يجب أن تدعم بنية التطبيق الخاصة بي كلا من Windows و Web "المنتهي الواجهة".

Quandry الخاص بي هو أحد النهج العام حيث يبدو أن هناك الكثير من الخيارات. نظرة DTO الخاصة بي شيء مثل العينة أدناه. كل DTO لديه إشارة إلى iSession التي تمر بها من بو. إنهم مسؤولون عن حملهم الخاص وحفظهم:

public class EmployeeDTO...

    // Data Properties to be persisted to the database
    public virtual int Id { get; private set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual ISession Session { get; set; }

    // Save logic
    public virtual void Save()
    {
        var transaction = Session.BeginTransaction();
        Session.SaveOrUpdate(this);
        transaction.Commit();
    }

    // Load logic
    public virtual void Load(int id)...

أولاً:هل هذا هو النهج الصحيح لاتخاذ - يجب أن يكون لدى DTO القدرة على حفظ وتحميل نفسها؟

ثانيًا:بغض النظر عن المكان الذي يكمن فيه رمز الحفظ / الحمل، هل يجب عليك استخدام نفس iSession لأمر الحياة أو كائن، أو يجب أن يكون لديهم مرجع مع isessionFactory وفتح جلسة جديدة في كل مرة يلزم تفاعل قاعدة البيانات؟

    // Open a new session every time I interact with the repository
    var session = FluentSupport.SessionFactory.OpenSession();
    var transaction = Session.BeginTransaction();
    Session.SaveOrUpdate(this);
    transaction.Commit();
    session.Close();
    // Close the session when I'm done

بالطبع هناك دائما الخيار 3، لا شيء مما سبق :)

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

المحلول

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

لإدارة مدى سوء الاستخدام، عليك أن تقرر ما إذا كنت ستستخدم نمط UnitoFwork، والذي يقول أساسا كل طلب المستخدم يحصل على iSession جديد. هناك خيارات أخرى لمدى سوء مدى الحياة وكذلك لا تقتصر حقا في هذا الصدد. في كثير من الأحيان، قد يكون هناك أفضل الممارسات حول تطبيقات الويب مقابلات الويب مقابل تطبيقات Windows مقابل أي أنواع التطبيقات الأخرى، لكنك لم تحدد أنك تكتب.

نصائح أخرى

حافظ على تحميل رمز التحميل / حفظك من DTOS. كائنات DTO هي فقط الآراء من البيانات الأساسية.

عند إجراء استفساراتك، قم بإرجاع DTOS باستخدام تحويل. شيء من هذا القبيل:

resultSet = session.CreateCriteria(typeof(MyDataObject))
    .Add(query criteria, etc.)
    .SetResultTransformer(Transformers.AliasToBean<MyDTOObject>())
    .List<IMyDTOObject>()

من المفترض أن تكون DTO أن تكون "كائنات نقل البيانات". وهذا هو، الأشياء البكمية المستخدمة في اجتياز قيم أو مجموعات من القيم في نظامك. لا ينبغي أن يكونوا مسؤولين عن الاستمرار في أنفسهم، أو حتى خريطة 1-1 إلى كائنات المجال في طبقة المجال الخاصة بك.

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

في السيناريو الخاص بك ربما أذهب لنهج موجه نحو الخدمة لتخزين البيانات استرداد البيانات. بمعنى أن DTO لن يتم استخدامها داخليا فقط داخل حدود الخدمة. إذا كنت بحاجة إلى نسخ الكائنات التي تبدو كما أقترح عليك إلقاء نظرة على Automapper. الذي تم إنشاؤه لهذا الغرض المحدد. إذا كان لديك مشروع Windows فقط أو موقع الويب فقط، فهذا ليس مشكلة. انها عندما تخلط. لا يمكنك التعامل مع الجلسات بنفس الطريقة في تطبيق Windows كما هو الحال في تطبيق ويب.

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