5

अगर मैं http://localhost:58472/Account/Register को सर्फ मैंने इस अपवादवर्तमान प्रकार, IUserStore <ApplicationUser> और DbConnection क्रमश: एक इंटरफेस और अमूर्त वर्ग के हैं और निर्माण नहीं किया जा सकता

System.InvalidOperationException: वर्तमान प्रकार, IUserStore<ApplicationUser>, एक इंटरफ़ेस है और इसका निर्माण नहीं किया जा सकता है। क्या आप एक प्रकार मैपिंग खो रहे हैं?

यहाँ मेरी कोड है:

public class ApplicationUserManager : UserManager<ApplicationUser> 
{ 
    public ApplicationUserManager(IUserStore<ApplicationUser> store) 
     : base(store) 
    { } 

    public static ApplicationUserManager Create(
     IdentityFactoryOptions<ApplicationUserManager> options, 
     IOwinContext context) 
    { 
     var manager = new ApplicationUserManager(
      new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()) 
     ); 

     // other code 
     return manager; 
    } 
} 

और यहाँ नियंत्रक में कोड है:

[Authorize] 
public class AccountController : Controller 
{ 
    private ApplicationSignInManager _signInManager; 
    private ApplicationUserManager _userManager; 

    public AccountController() 
    { 
    } 

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

    public ApplicationSignInManager SignInManager 
    { 
     get 
     { 
      return _signInManager ?? 
       HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); 
     } 
     private set 
     { 
      _signInManager = value; 
     } 
    } 

    public ApplicationUserManager UserManager 
    { 
     get 
     { 
      return _userManager ?? 
       HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     } 
     private set 
     { 
      _userManager = value; 
     } 
    } 

    [HttpGet] 
    [AllowAnonymous] 
    public ActionResult Login(string returnUrl) 
    { 
     ViewBag.ReturnUrl = returnUrl; 
     return View(); 
    } 
} 

तो तुम अगर आप मेरी कोड को पढ़ने के लिए देख सकते हैं, मैं कुछ भी नहीं करने के लिए बदल दिया है जब आप एक नया एमवीसी प्रोजेक्ट बनाते हैं तो मूल कोड, लेकिन मुझे उपरोक्त त्रुटि मिल गई है। मैंने क्या गलत किया?

मैंने अपने दूसरे कोड ब्लॉक में उसी कोड के साथ ProfileController नामक एक नया नियंत्रक बनाया है, लेकिन ApplicationSignInManager के बिना मुझे इसकी आवश्यकता नहीं है।

मैं पंजीकरण और सेवाओं का प्रबंधन करने के लिए एकता कंटेनर का भी उपयोग करता हूं।

public static class UnityConfig 
{ 
    public static void RegisterComponents() 
    { 
     var container = new UnityContainer(); 

     container.RegisterType<IGenericRepo<Category>, GenericRepo<Category>>(); 
     container.RegisterType<ICategoryService, CategoryService>(); 
     //container.RegisterType<IUser, ApplicationUser>(); 

     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
    } 
} 

अगर मैं उपरोक्त कोड में लाइन uncomment वहाँ कोई अंतर जब मैं साइट चलाने नहीं हैं, यहाँ कोड है।


अद्यतन:

एक टिप्पणी @Jay से मैं एकता प्रबंधक में इस कोड जोड़ दिया गया।

System.InvalidOperationException:

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

अब मैं इस अपवाद मिल गया है वर्तमान प्रकार, System.Data.Common.DbConnection, एक अमूर्त वर्ग है और निर्माण नहीं किया जा सकता है। क्या आप एक प्रकार मैपिंग खो रहे हैं?

यहाँ स्टैक ट्रेस से कुछ जानकारी है: जब प्रकार AccountController के एक नियंत्रक बनाने का प्रयास कर

  1. InvalidOperationException

    एक त्रुटि हुई। सुनिश्चित करें कि नियंत्रक के पास पैरामीटर रहित सार्वजनिक कन्स्ट्रक्टर है।

    हां, मुझे एक अनुमोदित सार्वजनिक कन्स्ट्रक्टर मिला है।

  2. निर्भरता के ResolutionFailedException

    संकल्प विफल रहा है, type = "AccountController", नाम = "(none)"

तो मैं एकता प्रबंधक में इस लाइन को जोड़ दिया है:

container.RegisterType<IDbConnection, DbConnection>(); 

लेकिन मैं अभी भी एक ही अपवाद है है।

वर्तमान प्रकार, System.Data.Common.DbConnection ...


अद्यतन:

@RandyLevy द्वारा एक टिप्पणी मैं इस की कोशिश की है से, यह सवाल Configure Unity DI for ASP.NET Identity द्वारा की मदद:

  1. AccountController को यह जोड़ना:

    // two fields added 
    private readonly UserManager<ApplicationUser> _userManager; 
    private readonly RoleManager<IdentityRole> _roleManager; 
    
    // constructor added 
    public AccountController(
        IUserStore<ApplicationUser> userStore, 
        IRoleStore<IdentityRole> roleStore, 
        ApplicationSignInManager signInManager) 
    { 
        _userManager = new UserManager<ApplicationUser>(userStore); 
        _roleManager = new RoleManager<IdentityRole>(roleStore); 
        SignInManager = signInManager; // I need this 
    } 
    
    public ApplicationSignInManager SignInManager // I need this 
    { 
        get 
        { 
         return _signInManager ?? 
          HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); 
        } 
        private set 
        { 
         _signInManager = value; 
        } 
    } 
    
    public UserManager<ApplicationUser> UserManager // replace by other property 
                   // type of ApplicationUserManager 
    { 
        get 
        { 
         return _userManager ?? 
          HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
        } 
        //private set // comment this because _usermanager is readonly. 
        //{ 
        // _userManager = value; 
        //} 
    } 
    
    //public ApplicationUserManager UserManager // replaced by the property type of 
    //           // UserManager<ApplicationUser> 
    //{ 
    // get 
    // { 
    //  return _userManager ?? 
    //   HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
    // } 
    // private set 
    // { 
    //  _userManager = value; 
    // } 
    //} 
    
  2. UnityManager में इस जोड़ना:

    InjectionConstructor accountInjectionConstructor = 
        new InjectionConstructor(new ApplicationDbContext()); 
    
    container.RegisterType<AccountController>(); 
    container.RegisterType<IController, Controller>(); 
    
    container.RegisterType 
        <IRoleStore<IdentityRole>, RoleStore<IdentityRole>> 
        (accountInjectionConstructor); // on this line 
    
    container.RegisterType 
        <IUserStore<ApplicationUser>, UserStore<ApplicationUser>> 
        (accountInjectionConstructor); 
    

लेकिन मैं टिप्पणी के साथ लाइन पर इस त्रुटि (कोई रन टाइम अपवाद) मिल गया है:

प्रकार RoleStore<IdentityRole> सामान्य प्रकार या मेथ में प्रकार पैरामीटर TTo के रूप में उपयोग नहीं किया जा सकता आयुध डिपो नीचे:

UnityContainerExtensions.RegisterType<TFrom, TTo> 
    (IUnityContainer, params InjectionMember[]) 

RoleStore<IdentityRole> से IRoleStore<IdentityRole> करने के लिए कोई अंतर्निहित संदर्भ रूपांतरण नहीं है।

+2

क्या आप IUserStore के लिए एक रजिस्टर प्रकार खो रहे हैं? – Jay

+1

https://stackoverflow.com/questions/21927785/configure-unity-di-for-asp-net-identity मदद कर सकता है। –

+0

@Jay: धन्यवाद, संकेत के लिए लेकिन अब मुझे एक और अपवाद है। मेरे प्रश्न में अधिक जानकारी। –

उत्तर

13

अंत में मुझे अपनी समस्या का समाधान मिला है। मैंने इस कोड को यूनिटी मैनेजर में जोड़ा है।

container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager()); 
container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager()); 
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager()); 
container.RegisterType<AccountController>(new InjectionConstructor()); 
+1

मुझे केवल उस त्रुटि को प्राप्त करना शुरू हुआ जो ओपी स्थापित करने के बाद ओपी प्राप्त कर रहा था। ऐसा लगता है कि यूनिटी के निर्भरता रिज़ॉल्वर के साथ मूल पहचान कार्यक्षमता के साथ काम नहीं कर रहा है। इन प्रकारों को पंजीकृत करने से इसे ठीक किया गया। – JARRRRG

2

एच पॉउलीन उत्तर के लिए अद्यतन। इसके लिए मूल समस्या यह है कि एकता दो पैरामीटर के साथ कन्स्ट्रक्टर को कॉल करने का प्रयास करती है।

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

निम्नलिखित पंक्ति एकता को पैरामीटर रहित कन्स्ट्रक्टर को कॉल करने के लिए बताएगी और उसे किसी और चीज की आवश्यकता नहीं होगी। यह मेरे लिए काम किया।

container.RegisterType<AccountController>(new InjectionConstructor()); 
संबंधित मुद्दे