6

Autofac 3.0 में MultitenantIntegration समर्थन और its preview release is out होगा।एएसपी.नेट वेब एपीआई एप्लिकेशन में ऑटोफैक मल्टी-किरायेदार आईओसी कंटेनर

public class Global : System.Web.HttpApplication { 

    protected void Application_Start(object sender, EventArgs e) { 

     var config = GlobalConfiguration.Configuration; 
     config.Routes.MapHttpRoute("Default", "api/{controller}"); 
     RegisterDependencies(config); 
    } 

    public void RegisterDependencies(HttpConfiguration config) { 

     var builder = new ContainerBuilder(); 
     builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

     // creates a logger instance per tenant 
     builder.RegisterType<LoggerService>().As<ILoggerService>().InstancePerTenant(); 

     var mtc = new MultitenantContainer(
      new RequestParameterTenantIdentificationStrategy("tenant"), 
      builder.Build()); 

     config.DependencyResolver = new AutofacWebApiDependencyResolver(mtc); 
    } 
} 

यह काम किया हो जाता है और ILoggerService किरायेदार के अनुसार एक LoggerService उदाहरण बनाता है: इसे आज़माने के लिए, मैं निम्नलिखित विन्यास के साथ एक ASP.NET वेब API एप्लिकेशन बनाया।

  1. मैं बॉक्स से बाहर इस्तेमाल किया सिर्फ इस डेमो आवेदन के लिए यहाँ TenantIdentificationStrategy के रूप में प्रदान की जाती RequestParameterTenantIdentificationStrategy: मैं इस स्तर पर दोनों समस्याओं जो मैं हल करने में सक्षम नहीं था। मैं ITenantIdentificationStrategy इंटरफ़ेस को लागू करके अपना कस्टम TenantIdentificationStrategy बनाने में सक्षम हूं। हालांकि, TryIdentifyTenantITenantIdentificationStrategy की विधि आपको HttpContext.Current जैसे स्थिर उदाहरण पर भरोसा करती है जो कि मैं एएसपी.NET वेब एपीआई वातावरण में नहीं चाहता हूं क्योंकि मैं चाहता हूं कि मेरा एपीआई अज्ञेयवादी हो (मुझे पता है कि मैं प्रतिनिधि हूं यह होस्टिंग परत पर काम करता है लेकिन मैं नहीं करना चाहता)। क्या इस तरीके से इसे हासिल करने का एक और तरीका है कि मैं एक स्थिर उदाहरण पर भरोसा नहीं करूंगा?
  2. मैं भी नीचे के रूप में किरायेदार विशिष्ट उदाहरण रजिस्टर करने के लिए एक मौका है:

    mtc.ConfigureTenant("tenant1", cb => cb.RegisterType<Foo>() 
                .As<IFoo>().InstancePerApiRequest()); 
    
    हालांकि

    , मेरी स्थितियों में से एक ने मुझे आवश्यकता निर्माता पैरामीटर के माध्यम से किरायेदार नाम पारित करने के लिए और मैं नीचे की तरह कुछ है करने के लिए प्यार होता है :

    mtc.ConfigureTenant((cb, tenantName) => cb.RegisterType<Foo>() 
                .As<IFoo>() 
                .WithParameter("tenantName", tenantName) 
                .InstancePerApiRequest()); 
    

    वर्तमान में ऐसा कोई एपीआई नहीं है। क्या यह हासिल करने का कोई और तरीका है या इस तरह की आवश्यकता का कोई मतलब नहीं है?

उत्तर

4

बहुआयामी समर्थन लंबे समय तक उपलब्ध रहा है, यह सिर्फ 3.0 है जब हमारे पास NuGet पैकेज था। :)

RequestParameterTenantIdentificationStrategy दस्तावेज के रूप में, एक बहुत ही सरल उदाहरण दिखा रहा है, केवल एक बहुत ही सरल उदाहरण दिखा रहा है (और अनुशंसित) किरायेदार की पहचान करने का तरीका। ऑपरेटिंग संदर्भ के आधार पर आपको अपने किरायेदार को पहचानने के लिए खुद को चुनना होगा। यह web.config मूल्य, एक पर्यावरण परिवर्तनीय, या वर्तमान वातावरण में कुछ अन्य चीज़ों से हो सकता है। यदि आप HttpContext.Current का उपयोग नहीं करना चाहते हैं, तो नहीं। यह चुनने के लिए आप कहां से यह जानकारी प्राप्त करते हैं।

(RPTIStrategy पर एक नोट - अनुशंसा नहीं किया गया हिस्सा एक क्वेरीस्ट्रिंग या किरायेदार आईडी तंत्र के रूप में अनुरोध पैरामीटर का उपयोग कर रहा है। मैं अपने उत्पादन ऐप्स में HttpContext का उपयोग करता हूं और यह ठीक काम करता है। केवल इतना ही है कि आप अमूर्त कर सकते हैं इससे पहले कि आप वास्तव में नंगे धातु को छूएं।)

लैम्बडा पंजीकरण वाक्यविन्यास प्रदान करने के लिए बॉक्स से कोई रास्ता नहीं है, मुख्य रूप से क्योंकि किरायेदार को संकल्प प्रक्रिया के माध्यम से पारित नहीं किया जाता है। संकल्प प्रक्रिया है:

  1. रणनीति के साथ किरायेदार की पहचान करें।
  2. किरायेदार के कॉन्फ़िगर किए गए जीवनकाल के दायरे को ढूंढें।
  3. मानक ऑटोफैक संकल्प शैली वाक्यविन्यास का उपयोग करें।

यह जानबूझकर सरल संचालन के लिए सरल और समान है।संकल्प के समय, किरायेदार से संबंधित उप-जीवनकाल-दायरा किरायेदार आईडी के साथ टैग किया गया है लेकिन संकल्प ऑपरेशन किरायेदार आईडी के बारे में नहीं जानता है ... इसलिए लैम्ब्डा काम नहीं करेगा (और शायद जीता कभी भी जल्द ही नहीं क्योंकि यह ऑटोफैक काम करता है जिस तरह से मौलिक आंतरिक बदल जाएगा)।

पूरा करने के लिए आप जो खोज रहे हैं, जब दर्ज की आप InstancePerTenant विस्तार के संयोजन का उपयोग कर सकते हैं ...

var builder = new ContainerBuilder(); 
builder.RegisterType<Foo>().As<IFoo>().InstancePerTenant(); 

... और अपने कंटेनर में एक निर्भरता के रूप में ITenantIdentificationStrategy दर्ज की।

builder.Register(myIdStrategy).As<ITenantIdentificationStrategy>(); 

फिर अपनी कक्षा को सीधे किरायेदार आईडी की बजाय ITenantIdentificationStrategy लें। इसके बजाय किरायेदार आईडी प्राप्त करने के लिए रणनीति का उपयोग करें।

यदि आप वास्तव में फैंसी प्राप्त करना चाहते हैं, तो आप आईडी कुंजी रणनीति को हल करने वाले एक कुंजी वाले लैम्बडा को पंजीकृत कर सकते हैं, फिर किरायेदार आईडी प्राप्त कर सकते हैं। फिर आप ऑब्जेक्ट में पैरामीटर पंजीकरण जोड़ सकते हैं जैसे कि आपने किया लेकिन एक कीड सेवा का उपयोग कर। फिर (मैं अब स्मृति से जाने के लिए है, तो आप अपना वाक्य रचना यहाँ की दोबारा जांच करना होगा जा रहा हूँ, लेकिन यह कुछ इस तरह हो जाएगा ...)

builder.Register(c => 
     { var s = c.Resolve<ITenantIdentificationStrategy>(); 
      object id; 
      s.TryIdentifyTenant(out id); 
      return id; 
     }).Keyed<object>("tenantId"); 

builder.RegisterType<Foo>() 
     .As<IFoo>() 
     .WithParameter(
     (pi, c) => pi.Name == "tenantId", 
     (pi, c) => c.ResolveKeyed<object>("tenantId")) 
     .InstancePerApiRequest(); 

, आप करना चाहते हैं उस पर मुझे दोबारा जांचें, लेकिन मुझे पूरा यकीन है कि (या मामूली बदलाव) आपको जो चाहिए वह प्राप्त करने के लिए काम करना चाहिए।

+0

धन्यवाद ट्रैविस। वास्तव में सहायक आपका आखिरी नमूना वास्तव में वही है जो मैं ढूंढ रहा हूं। मुझे पहले इसके बारे में सोचना चाहिए :) तो, मेरे 'ITenantIdentificationStrategy' को वास्तव में एक स्थिर वस्तु पर होना चाहिए। फिर होस्टिंग परत में 'TenantIdentificationStrategy' को प्रतिनिधि करने के बजाय मेरे लिए कोई अन्य विकल्प नहीं है जिसमें प्रति-अनुरोध स्थिर संदर्भ है। – tugberk