لماذا يمكنني استخدام وحدة نمط العمل على رأس جلسة أحذية؟

StackOverflow https://stackoverflow.com/questions/980584

  •  13-09-2019
  •  | 
  •  

سؤال

متى أكتب تنفيذ uow فوق ما هو مقدمة بالفعل بواسطة lhibernate؟ أي أمثلة عالمية حقيقية؟

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

المحلول

يتم تقديم وحدة العمل التي تصفها بالفعل بواسطة Lihibernate لذلك لا يوجد سبب للقيام بمثل هذه الوحدة العمل.

ما لدينا في خدمة WCF لدينا هو وحدة مستوى أعلى من العمل الذي يحتوي على معلومات مهمة في طلبنا الوحدة الحالية للعمل. ويشمل ذلك تجريد ISESOSE LOHIPERNATE بالنسبة لنا. عند كسره، يكون لديك رمز يناسب ثلاث فئات

  1. الرمز الذي يحتاج إلى التعامل مع وحدة العمل. لا يهم من الذي يدعم وحدة العمل. يمكن أن يكون أحيانا أو ibatis أو orm مخصص. يحتاج جميع التعليمات البرمجية إلى القيام به هو الحمل، Rollback، حفظ، وما إلى ذلك. لا يهتم بهذه الآلية المستخدمة للقيام بذلك.

  2. الرمز الذي يحتاج إلى التعامل مع Isession مباشرة لأنه يقوم بأشياء محددة أحذية. عادة ما يتعلق الأمر بالاستفسارات المعقدة التي يجب إنشاءها.

  3. لا يحتاج إلى معرفة أنه يعمل في وحدة العمل أو الوصول إلى ISESION. يمكننا أن نتجاهل ذلك تماما كجزء من هذه المناقشة.

في حين أن الرمز في 1. يمكن أن يعمل فقط ضد Isession هو تفضيلنا هو محاولة تجريد الأشياء في التعليمات البرمجية التي لا نتحكم بها مباشرة أو يمكن أن تتغير. هذا له قيمة لسببين.

  • عندما بدأنا أننا لم نتم بيع 100٪ على أحمق. كنا نفكر في ibatis أو شيء مخصص. من الواضح أن هذا لم يعد مشكلة.

  • الفريق بأكمله ليس خبراء في أحمق ولا نريد أن يكونهم. بالنسبة لمعظم الأشخاص، يكتبون رمز يناسب الفئة 1. وكل ما يعرفون عنه هو وحدة عملنا. عندما يكون الرمز في الفئة 2. يجب أن يكتبه من قبل الناس في الفريق يفهم أحمق جيدا.

إذ يغلق، أود أن أقول إن نوع وحدة العمل التي تتحدث عنه ليس هناك حاجة، أود أن أقترح أن وحدة العمل العالية يمكن أن توفر الكثير من القيمة.

نصائح أخرى

تحتوي وحدة واجهة العمل الأساسية الخاصة بي على الطرق التالية - تهيئة - الالتزام - التراجع - Idisposable.Dispos

أنا استخدمها لكلا الدورة وإدارة المعاملات. من المفيد لأنني لا يجب عليك كتابة هذا الرمز مرارا وتكرارا لنطاقات جلسة مختلفة. (وحدة العمل لكل طلب، لكل سلسلة من الطلبات، لكل موضوع، إلخ)

شريطة أن تقوم بإعداد جميع التعيينات الخاصة بك بشكل صحيح (أي CASCASS)، فلن تضطر إلى القيام بأي شيء خاص و ISession سوف تفعل غرامة فقط. ومع ذلك، إذا كنت تكتب تطبيقا ثلاث طبقات، فستضطر إلى عمليات قاعدة البيانات التسلسل التي تريد تنفيذها يدويا في معاملة واحدة. يمكن أن تكون FOWLER's "التنفيذ المرجعي" في "أنماط تطبيقات تطبيق المؤسسات" نقطة انطلاق جيدة:

class UnitOfWork... 

   public void registerNew(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
      Assert.isTrue("object not dirty", !dirtyObjects.contains(obj));
      Assert.isTrue("object not removed", !removedObjects.contains(obj));
      Assert.isTrue("object not already registered new", !newObjects.contains(obj));
      newObjects.add(obj);
   }
   public void registerDirty(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
      Assert.isTrue("object not removed", !removedObjects.contains(obj));
      if (!dirtyObjects.contains(obj) && !newObjects.contains(obj)) {
         dirtyObjects.add(obj);
      }
   }
   public void registerRemoved(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
      if (newObjects.remove(obj)) return;
      dirtyObjects.remove(obj);
      if (!removedObjects.contains(obj)) {
         removedObjects.add(obj);
      }
   }
   public void registerClean(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
   }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top