使用简单注入器的身份自定义实现
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 注册它的方法。
我正在关注 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 注册它的方法。