身份提供者和Unity依赖注入



我已经下载了这个示例,我可以在ASP中尝试身份提供程序的功能。. NET MVC 5:

http://www.nuget.org/packages/Microsoft.AspNet.Identity.Samples

我已经多次使用Unity DI为我的仓库,服务,工作单元和其他东西没有问题。

但是现在,当我安装Unity DI时,我在使用身份提供程序的接口和DI上有很多问题。

我刚刚下载了示例的代码,我已经配置了Unity DI,但我不想使用Unity作为身份成员,我想使用Unity DI只是为我的东西(IRepository, IService, IUnitOfWork等)

当我尝试注册一个用户时,我有这个错误:

当前类型,Microsoft.AspNet.Identity.IUserStore ' 1 (Ecoavantis.Interactive.GCI.Models.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());
         }

好的,我已经解决了我的问题,我已经用这个方法注入了依赖关系,但我不太明白为什么它的工作…

现在,身份与我的Unity DI工作良好

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

在我的情况下,我在RegisterComponents方法中添加了以下内容到UnityConfig.cs。

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

感谢chemitaxis!因为我没有足够的代表评论,我张贴一个新的答案。我假设chemitaxis自己创建了最后3个控制器,因为简单地注册第一个AccountController似乎对我有用,即使我扩展了User模型属性:

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

更新chemitaxis和hvaughan3答案。既然你说它发生在你尝试注册一个用户时,它可能在标准的AccountController中。最初的问题是,Unity试图用两个参数调用构造函数,例如:

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

下面一行将告诉Unity调用无参数构造函数,而不需要其他任何东西。

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

我希望这个解释对你有帮助。

相关内容

  • 没有找到相关文章

最新更新