我跟随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感谢您的回答,但您的实现会产生此异常
答案 0 :(得分:3)
为我生成例外?
如果您提供了消息和堆栈跟踪,那么理解问题会更好。在这种情况下,我想我可以回答,虽然不知道例外我不能确定,只能猜测......
您错过了IConnectionFactory
的注册,并且Ninject的注册并非都是必要的,至少不是我所看到的。
从linked GitHub repo我可以看到,应用程序代码(MVC控制器)中唯一的依赖是UserManager<User>
。
因此对象图如下所示:
var accountController =
new AccountController(
new UserManager(
new UserRepository(
new SqlConnectionFactory(
connectionString))));
所以你只需要注册(除了Mvc控制器之外):
此时不需要其他注册。
查看实现,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}}。