के साथ सेवा लोकेटर से बचें मैं एक एप्लिकेशन बना रहा हूं जो DI के लिए ऑटोफ़ैक 2 का उपयोग करता है। मैं reading रहा हूं कि एक स्थिर IoCHelper (सेवा लोकेटर) का उपयोग करना चाहिए।ऑटोफ़ैक 2
IoCHelper.cs
public static class IoCHelper
{
private static AutofacDependencyResolver _resolver;
public static void InitializeWith(AutofacDependencyResolver resolver)
{
_resolver = resolver;
}
public static T Resolve<T>()
{
return _resolver.Resolve<T>();
}
}
एक previous question के जवाब से, मैं एक तरह से मदद करने के लिए Auto-generated Factories के उपयोग के माध्यम से मेरे UnitOfWork में मेरी IoCHelper उपयोग करने के लिए की जरूरत को कम पाया गया। इस पथ को जारी रखते हुए, मैं उत्सुक हूं अगर मैं पूरी तरह से अपने IoCHelper को खत्म कर सकता हूं। मैं एक स्थिर सेटिंग वर्ग है कि मेरे विन्यास कार्यान्वयन के चारों ओर एक आवरण के रूप में कार्य करता है है
:
यहाँ परिदृश्य है। चूंकि सेटिंग क्लास मेरी अन्य कक्षाओं के बहुमत की निर्भरता है, इसलिए रैपर मुझे अपने आवेदन के दौरान सेटिंग कक्षा को इंजेक्ट करने से रोकता है।
Settings.cs
public static class Settings
{
public static IAppSettings AppSettings
{
get
{
return IoCHelper.Resolve<IAppSettings>();
}
}
}
public interface IAppSettings
{
string Setting1 { get; }
string Setting2 { get; }
}
public class AppSettings : IAppSettings
{
public string Setting1
{
get
{
return GetSettings().AppSettings["setting1"];
}
}
public string Setting2
{
get
{
return GetSettings().AppSettings["setting2"];
}
}
protected static IConfigurationSettings GetSettings()
{
return IoCHelper.Resolve<IConfigurationSettings>();
}
}
वहाँ एक रास्ता एक सेवा लोकेटर का उपयोग किए बिना और प्रत्येक और हर वर्ग में AppSettings इंजेक्शन का सहारा के बिना इस संभाल करने के लिए है? नीचे सूचीबद्ध 3 जिन क्षेत्रों में मैं निर्माता इंजेक्शन के बजाय ServiceLocator पर झुकाव रखने हैं:
- AppSettings
- लॉगिंग
- कैशिंग
यह एक अच्छा मुद्दा है। सचमुच, मुझे शायद उन निर्भरताओं को हर वर्ग में इंजेक्ट करने की आवश्यकता नहीं है, लेकिन उन मामलों के लिए जब मेरे पास समान निर्भरता को बड़ी संख्या में कक्षाओं में इंजेक्शन दिया जाता है, तो मैं केवल उत्सुक था कि इसके लिए कुछ डीआई सर्वोत्तम अभ्यास है। –
मेरा अद्यतन उत्तर देखें। सत्य कहा जाता है, मुझे इसे एक अवसर पर करने के लिए मजबूर किया गया है: जब कन्स्ट्रक्टर इंजेक्शन का उपयोग नहीं किया जा सकता था (डिजाइनर को पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता होती है)। –
अच्छा कामकाज – Baldy