سؤال

أنا أكتب وحدة C # .NET وأود استخدام نمط المزود.

إذا كان الرمز الخاص بي يعمل على خادم ويب، فقد حقق الوصول إليه System.Web.Configuration ويمكن أن تتصل ProvidersHelper لتحميل مزود مناسب على النحو الذي يحدده web.config بيانات.

إذا كان الرمز الخاص بي يعمل في بيئة قائمة بذاتها، فلن أتمكن من الوصول إلى هذه الفئة.

يبدو لي أنني قد أكتب فئة مجمعة تستخدم التفكير إلى (أ) تحديد ما إذا كان يمكنني الوصول إلى المدمج System.Web.Configuration.ProvidersHelper, ، وإذا لم يكن كذلك، (ب) توفر واجهة معادلة وظيفيا تعتمد فقط على الموارد التي أتاح فيها في الوضع المستقل.

هل أصبح أي شخص هناك هذه المشكلة قبل و / أو لديك اقتراحات؟

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

المحلول

إذا كنت ترغب في تجنب المرجع على System.Web التجميع، سيتعين عليك إنشاء واجهة تعرض المعلومات التي تهتم بها والحصول على المستهلكين لتوفير منفذين لهذه الواجهة حسب الاقتضاء:

// Core assembly, doesn't reference System.Web
public class ThisUsesProviders {
    public ThisUsesProviders(IProviderProvider pp) { ... }
}

public interface IProviderProvider {
   SpecialProvider InstantiateSpecialProvider(/* custom arguments */);
}

// Helper assembly, references System.Web
public class DefaultProviderProvider : IProviderProvider
{
    SpecialProvider InstantiateSpecialProvider(/* custom arguments */)
    {
        // call ProvidersHelper 
    }
}

// standalone consumer:
var thing = new ThisUsesProvider(new NonStandardProvider());

// ASP.NET:
var thing = new ThisUsesProvider(new DefaultProviderProvider());

هذا النمط يسمى حقن التبعية و قلب السيطرة.

نصائح أخرى

تحقق لمعرفة ما إذا كان HttpContext.current غير فارغ:

if(HttpContext.Current!=null)
   // I'm running on a web server

يمكنك إنشاء وظيفة Statis Isweb التي ترجع ما إذا كانت HTTPCONTEXT.CURRENT NULL NULL.

إذا لم تكن NULL، فقد حصلت على موقع ويب، إذا كان لاغيا، فأنت لا تفعل ذلك.

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

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