0

我正在关注MVC5-Dapper-Identity回购以自定义实现身份与短纤维。我的问题是当我注册依赖到iOC容器这个例子使用Ninject,但我使用简单的注射器。这个例子注册了自己的dependacies为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(); 

我试图用简单的喷油器,其用于生成异常我

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>)); 

如何做简单的注射器上述实施

更新

@Ric .Net感谢您的答案,但您的实施属TE此异常

enter image description here

+0

您是否阅读过异常中提供的文档链接? – Steven

+0

ohh我的不好感谢信息 – Gayan

回答

3

对我产生异常?

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

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

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

对象图从而看起来如下:

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

所以只需登记为(除了MVC控制器ofcourse):

  • 的UserManager =>的UserManager
  • IUserStore => UserRepository
  • 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>>(); 

简单的喷油器不具备.WithConstructorArgument流利的API调用出的现成的支持,但由于实现可以是Singleton无论如何,这不是一个问题完全可以在组合根中创建一个实例,并让Simple Injector存储这个已经创建的实例。

如果确实需要将其他接口注入某处,则在文档中说明了使用简单注入器注册该接口的方法here

+0

感谢您的答案请参阅更新的问题 – Gayan

+0

我认为UserManager应注册为Lifestyle.Scoped。 – Steven

相关问题