2014-07-14 8 views
23

मैं इस नमूने जिसमें मैं ASP.NET MVC 5 में पहचान प्रदाता की सुविधाओं की कोशिश कर सकते डाउनलोड किया है , सेवाओं, काम की इकाई और समस्याओं के बिना अन्य सामान।पहचान प्रदाता और एकता निर्भरता इंजेक्शन

लेकिन अब, जब मैं यूनिटी डी स्थापित करता हूं, तो मुझे इंटरफेस और डीआई के साथ कई समस्याएं होती हैं जो पहचान प्रदाता का उपयोग करती हैं।

मैंने अभी उदाहरण के कोड को डाउनलोड किया है और मैंने यूनिटी डी को कॉन्फ़िगर किया है, लेकिन मैं पहचान सदस्यता के लिए एकता का उपयोग नहीं करना चाहता, मैं केवल मेरे लिए यूनिटी डी का उपयोग करना चाहता हूं (आईआरपीओएसटीरी, आईएसईसी,

वर्तमान प्रकार, Microsoft.AspNet.Identity.IUserStore`1 [Ecoavantis.Interactive.GCI.Models: IUnitOfWork, आदि)

जब मैं एक उपयोगकर्ता रजिस्टर करने की कोशिश मैं यह त्रुटि है। ApplicationUser], एक इंटरफ़ेस है और इसका निर्माण नहीं किया जा सकता है। क्या आप मैपिंग टाइप कर रहे हैं?

मैं कुछ पोस्ट जिसमें वे कहा कि मैं कुछ इस तरह शामिल करना चाहिए पढ़ा है, लेकिन मैं पहचान प्रदाता में निर्भरता इंजेक्षन की जरूरत नहीं है ...

container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager()); 
      container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager()); 

किसी को भी मेरी मदद कर सकते हैं?

कोड उदाहरण:

/// <summary>Registers the type mappings with the Unity container.</summary> 
     /// <param name="container">The unity container to configure.</param> 
     /// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to 
     /// change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks> 
     public static void RegisterTypes(IUnityContainer container) 
     { 
      // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements. 
      // container.LoadConfiguration(); 
      // TODO: Register your types here 


      //container.RegisterType<DbContext, ApplicationDbContext>(new ContainerControlledLifetimeManager()); 
      container.RegisterType<IUnitOfWorkAsync, UnitOfWork>(new PerRequestLifetimeManager()); 
      container.RegisterType<IMainPanelService, MainPanelService>(); 
      container.RegisterType(typeof (IRepositoryAsync<>), typeof (Repository<>)); 
      container.RegisterType<IDataContextAsync, ecoavantisinteractivegciContext>(new PerRequestLifetimeManager()); 
     } 
+0

आपका एप्लिकेशन यूज़र क्लास कैसा दिखता है? यह कह रहा है कि यह एक इंटरफेस होने पर कक्षा के रूप में उपयोग किया जा रहा है। यदि आप एप्लिकेशन उपयोगकर्ता के लिए इंटरफ़ेस का उपयोग कर रहे हैं, तो क्या आपने उस इंटरफ़ेस के लिए DI को कॉन्फ़िगर करने और इसके कार्यान्वयन की कोशिश की है? – grimurd

+0

हां, मैंने कोशिश की है, लेकिन यह काम नहीं करता है ... मेरे पास कुछ प्रश्न समान हैं: http://stackoverflow.com/questions/24731426/register-iauthenticationmanager-with-unity – chemitaxis

उत्तर

38

ठीक है, मैं अपने समस्या हल हो गई है, मैं इस विधि के साथ निर्भरता इंजेक्शन दिया है, लेकिन मैं बहुत अच्छी तरह से समझ में नहीं आता क्यों यह काम है ...

अब, पहचान मेरे यूनिटी डी

container.RegisterType<AccountController>(new InjectionConstructor()); 
container.RegisterType<RolesAdminController>(new InjectionConstructor()); 
container.RegisterType<ManageController>(new InjectionConstructor()); 
container.RegisterType<UsersAdminController>(new InjectionConstructor()); 
+2

(पार्टी के देर से बिट)। खाता नियंत्रक बनाते समय पैरामीटर कम कन्स्ट्रक्टर (इंजेक्शन कॉन्स्ट्रक्टर-ऑब्जेक्ट खाली है) का उपयोग करने के लिए उन निर्देश बल एकता। अन्यथा एकता 'सबसे निर्दिष्ट' कन्स्ट्रक्टर को हल करने का प्रयास करेगी (और असफल हो जाएगी)। – Dribbel

+2

वैकल्पिक रूप से AccountController में खाली कन्स्ट्रक्टर पर [इंजेक्शन कॉन्स्ट्रक्टर] विशेषता दें। –

9

धन्यवाद chemitaxis के साथ ठीक काम करता है! चूंकि मैं टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं हूं, इसलिए मैं एक नया उत्तर पोस्ट कर रहा हूं। मैं chemitaxis अपने दम पर पिछले 3 नियंत्रक बनाया क्योंकि बस पहले AccountController दर्ज की मेरे लिए काम किया है लगता है यह सोचते हैं रहा हूँ, भले ही मैं User मॉडल गुण बढ़ाया:

container.RegisterType<AccountController>(new InjectionConstructor()); 
13

मेरे मामले में मैं UnityConfig के लिए निम्न जोड़ा RegisterComponents विधि में .cs।

container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(); 
0

chemitaxis और hvaughan3 उत्तर के लिए अद्यतन। चूंकि आप कहते हैं कि जब आप किसी उपयोगकर्ता को पंजीकृत करने का प्रयास करते हैं तो यह संभवतः मानक AccountController मानक में होता है। इस के लिए मूल समस्या यह है कि एकता उदाहरण के लिए, दो मापदंडों के साथ निर्माता कॉल करने के लिए कोशिश करता है:

public AccountController(
    ApplicationUserManager userManager, 
    ApplicationSignInManager signInManager) 
{ 
    UserManager = userManager; 
    SignInManager = signInManager; 
} 

निम्नलिखित लाइन एकता बता देंगे बजाय parameterless निर्माता कॉल करने के लिए और कुछ और की जरूरत नहीं होगी।

container.RegisterType<AccountController>(new InjectionConstructor()); 

मुझे आशा है कि यह स्पष्टीकरण मदद करता है।

संबंधित मुद्दे