سؤال

ولقد باستخدام كتل في كل طريقة من بلدي المخزون. إذا أريد لعبور الطرق المرجعية، ويبدو أنه سيكون ضد أفضل الممارسات لتهيئة Datacontext آخر ما أفعل الخطأ؟ إذا كنت إعلان Datacontext في فئة بدلا من استخدام الكتل في أساليب وأنا لن تفقد القدرة على التخلص ؟؟

public IList<something> GetSomething()
{ 
   using (DB db=new DB())

   { ...GetListofSomethingElse(id)

   } 
}

public IList<somethingelse> GetListofSomethingElse(int id)
{ 
    using (DB db=new DB())
   {
     ... return IList 

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

المحلول

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

كنت لا عادة <م> الحاجة للتخلص من سياق البيانات ، على الرغم من أنني أميل إلى التخلص من أي شيء تنفيذ IDisposable.

نصائح أخرى

والواقع، وأعتقد أنه من غويا (أو كيف ينبغي أن أقول ذلك)، غير صحيح لخلق والتخلص من datacontext في المخزون الخاص بك.

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

وهكذا، وهذا هو كيف أفعل ذلك: (لاحظ أنني لا استخدام إطار الكيان، ولكن يمكنني استخدام NHibernate أفترض أن الطبقة DataContext في EF مشابهة لISession في NHibernate):

using( ISession s = theSessionFactory.OpenSession() )
{
    ICustomerRepository cr = RepositoryFactory.GetCustomerRepository(s);

    Customer c1 = cr.GetCustomer(1);
    Customer c2 = cr.GetCustomer(2);

    // do some other stuff
    s.StartTransaction();

    cr.Save (c1);
    cr.Save (c2);

    s.Commit();

}

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

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

ويمكنك الاتصال .Dispose () على فئة دون استخدام "باستخدام" بيان - عادة ما عليك القيام بذلك في أسلوب التخلص من المخزون الخاص بك، إذا كنت قد حصلت على واحدة

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