使用简单注入器的身份自定义实现

Identity Custom implementation With Simple Injector

我正在关注 MVC5-Dapper-Identity repo to have custom implementation of identity with dapper. my problem was when i registering dependancies to iOC container this example uses Ninject but i'm using Simple Injector. this example registered their dependacies as below

kernel.Bind<IConnectionFactory>().To<SqlConnectionFactory>()
    .WithConstructorArgument("connectionString", 
        ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
kernel.Bind<IUserRepository>().To<UserRepository>();
kernel.Bind<IUserStore<User>>().To<UserRepository>();
kernel.Bind<IUserLoginStore<User>>().To<UserRepository>();
kernel.Bind<IUserPasswordStore<User>>().To<UserRepository>();
kernel.Bind<IUserSecurityStampStore<User>>().To<UserRepository>();
kernel.Bind(typeof(UserManager<>)).ToSelf();

我尝试使用 Simple Injector 为我生成异常

container.Register<IUserRepository, UserRepository>();
container.Register<IUserStore<User>, UserRepository>();
container.Register<IUserLoginStore<User>, UserRepository>();
container.Register<IUserPasswordStore<User>, UserRepository>();
container.Register<IUserSecurityStampStore<User>, UserRepository>();
container.Register(typeof(UserManager<User>));

如何使用 Simple Injector 完成上述实现

更新

@Ric .Net 感谢您的回答,但您的实施会产生此异常

generates exception for me?

如果您提供消息和堆栈跟踪,会更好地理解问题。在这种情况下我想我可以回答,虽然不知道异常我不能确定并且只能猜测...

您错过了 IConnectionFactory 的注册和 Ninject 的注册并​​非都是必需的,至少从我看来不是。

据我所知 linked GitHub repo 应用程序代码(MVC 控制器)中的唯一依赖项是 UserManager<User>.

对象图如下所示:

var accountController = 
    new AccountController(
        new UserManager(
            new UserRepository(
                new SqlConnectionFactory(
                    connectionString))));

所以你只需要注册(除了 Mvc 控制器当然):

  • 用户管理器 => 用户管理器
  • IUserStore => 用户资料库
  • IConnectionFactory => SqlConnectionFactory

此时不需要其他注册。

查看 Dapper.Identity 中的 类 的实现,使用普通的 SQL 语句并且没有任何状态。因此,所有 Dapper.Identity 组件的生命周期可以是 Singleton。对于属于 Asp.Net Identity 的 UserManager,我不确定这是否可以是 Singleton.

需要的注册是:

var connectionFactory = new SqlConnectionFactory(connectionString);
container.RegisterSingleton<IConnectionFactory>(connectionFactory);
container.RegisterSingleton<IUserStore<User>, UserRepository>();
container.Register<UserManager<User>>();

Simple Injector 没有对 .WithConstructorArgument 流畅 api 调用的开箱即用支持,但是因为实现可以是 Singleton 无论如何,这不是根本没有问题,您只需在组合根中创建一个实例,然后让 Simple Injector 存储这个已经创建的实例。

如果您确实需要在某处注入其他接口,请在文档中解释 here 使用 Simple Injector 注册它的方法。