身份自定义实现使用Simple Injector

时间:2016-12-05 10:37:56

标签: c# dependency-injection ninject inversion-of-control simple-injector

我跟随MVC5-Dapper-Identity repo,与dapper一起自定义身份实现。我的问题是当我向iOC容器注册依赖项时,这个例子使用的是Ninject,但我使用的是Simple Injector。此示例将其相关性注册为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感谢您的回答,但您的实现会产生此异常

enter image description here

1 个答案:

答案 0 :(得分:3)

  

为我生成例外?

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

您错过了IConnectionFactory的注册,并且Ninject的注册并非都是必要的,至少不是我所看到的。

linked GitHub repo我可以看到,应用程序代码(MVC控制器)中唯一的依赖是UserManager<User>

因此对象图如下所示:

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

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

  • UserManager =&gt;的UserManager
  • IUserStore =&gt; UserRepository
  • IConnectionFactory =&gt; 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存储这个已经创建的实例。

如果你确实需要在其他地方注入其他接口,那么在文档中解释了使用Simple Injector注册它的方法{/ 3}}。