मैं अपने नियंत्रकों में सेवा इंजेक्शन के लिए Autofac उपयोग करने के लिए मेरी Asp.Net MVC3 परियोजना बदलने की प्रक्रिया में हूँ। अब तक यह बहुत सरल है। मेरी सेवाओं में सभी में टेलीरिक ओपनएप डीबी संपत्ति है जिसे मैं रचनाकारों (सेवा बेस क्लास में) के माध्यम से इंजेक्ट करता हूं। और मेरे नियंत्रकों में सभी सेवाओं के लिए कन्स्ट्रक्टर गुण होते हैं जो इंजेक्शन भी प्राप्त करते हैं।Autofac संपत्ति इंजेक्शन
public class AuditInfo
{
public string RemoteAddress { get; set; }
public string XForwardedFor { get; set; }
public Guid UserId { get; set; }
public string UserName { get; set; }
}
मेरी सेवा की कक्षाओं में मेरे OpenAccess db संपत्ति आदेश के रूप में उपयोग करने के लिए इस वर्ग यह करने में इंजेक्शन का एक उदाहरण की जरूरत है:
मैं एक वर्ग AuditInfo कहा जाता है जो एक नियंत्रक की लेखापरीक्षा योग्य गुण समाहित है विभिन्न डेटाबेस कॉल में ऑडिटिंग जानकारी।
समस्या यह है कि यह एक वर्ग नहीं है जिसे एप्लिकेशन_स्टार्ट पर तत्काल दोहराया जा सकता है क्योंकि इसके कम से कम दो गुण, RemoteAddress और XForwardedFO OnActionExecuting के शुरुआती चरण में आबादी वाले हैं, यानी अनुरोध चर मौजूद हैं।
इसलिए, मैं यह मेरी BaseController वर्ग के OnActionExecuting विधि में इस तरह के रूप का दृष्टांत:
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
db.AuditInfo = AuditInfo;
}
public AuditInfo AuditInfo
{
get
{
return new AuditInfo()
{
RemoteAddress = this.Request.ServerVariables["REMOTE_ADDR"],
XForwardedFor = this.Request.ServerVariables["X_FORWARDED_FOR"],
UserId = this.UserId,
UserName = this.UserName
};
}
}
तो - मेरी समस्या/प्रश्न हैं:
- मैं में इस प्रत्यक्ष पहुंच पसंद नहीं है OnActionExecuting में OpenAccess डीबी प्रॉपर्टी में।
- मैं इस AuditInfo मूल रूप से किसी AuditInfo संपत्ति में इंजेक्ट किया जा करना चाहते हैं कहीं भी
- मुझे नहीं लगता क्योंकि सेवा डाटाबेस पर निर्भर मैं AuditInfo के लिए निर्माता इंजेक्शन का उपयोग कर सकते हैं - नियंत्रकों सेवाओं पर निर्भर - db AuditInfo पर निर्भर करता है, लेकिन AuditInfo तब तक उपलब्ध नहीं है जब तक कि नियंत्रक को तत्काल नहीं किया जाता है और उसका पहला अनुरोध प्राप्त होता है। => सर्कुलर निर्भरता ...
मैं कैसे सेटअप autofac AuditInfo एक संपत्ति के रूप में यह है कि किसी भी वर्ग के लिए सुई हैं? या सर्कुलर निर्भरता को कम करने और लैम्ब्डा/आलसी कन्स्ट्रक्टर गुणों के कुछ रूपों का उपयोग करने का एक बेहतर तरीका है?
क्या यह सब कुछ इस बात से संबंधित है कि लेखापरीक्षा को हर अनुरोध पर संभावित रूप से अनावश्यक रूप से प्रारंभ किया जाता है, भले ही बहुत से अनुरोध एक ही सत्र का हिस्सा हो और अलग-अलग आईपी पता/उपयोगकर्ता जानकारी न हो?
धन्यवाद
मैं इस समस्या/प्रश्न 3 से असहमत - के रूप में स्टीवन बताते हैं आप 'उपयोग कर सकते हैं HttpContext.Current'। इसलिए 'ऑडिट इंफो' नियंत्रक पर निर्भर नहीं है, इसलिए कोई परिपत्र निर्भरता नहीं है, इसलिए यदि आप चाहें तो 'ऑडिट इंफो' को कन्स्ट्रक्टर-इंजेक्ट कर सकते हैं। –
खैर - मुझे लगता है कि ऐसा इसलिए है क्योंकि प्रस्तावित समाधान नियंत्रक के अंदर AuditInfo ऑब्जेक्ट को प्रारंभ करने के बजाय अनुरोध ऑब्जेक्ट का संदर्भ देने के लिए वैश्विक स्थैतिक चर का उपयोग कर रहा है जहां अनुरोध ऑब्जेक्ट स्वाभाविक रूप से मौजूद है। मुझे लगता है कि सर्वर चर अभी भी अनुप्रयोग_स्टार्ट में मौजूद नहीं है, जहां इंजेक्शन हो रहा है, क्योंकि एक क्रिया को पहले बुलाया जाना चाहिए, नहीं? – t316