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

相關問題