4

我需要添加會員重啓(RavenDb)到使用IOC簡單的注射器會員重啓與簡單的注射器

Ninject實施

var config = MembershipRebootConfig.Create(); 
kernel.Bind<MembershipRebootConfiguration<HierarchicalUserAccount>>().ToConstant(config); 
kernel.Bind<UserAccountService<HierarchicalUserAccount>>().ToSelf(); kernel.Bind<AuthenticationService<HierarchicalUserAccount().To<SamAuthenticationService<HierarchicalUserAccount>>(); 
kernel.Bind<IUserAccountRepository<HierarchicalUserAccount>>().ToMethod(ctx => new BrockAllen.MembershipReboot.RavenDb.RavenUserAccountRepository("RavenDb")); 
kernel.Bind<IUserAccountQuery>().ToMethod(ctx => new BrockAllen.MembershipReboot.RavenDb.RavenUserAccountRepository("RavenDb")); 

簡單的注射器實施

container.Register(MembershipRebootConfig.Create); 
container.Register<UserAccountService<HierarchicalUserAccount>>(); 
container.Register<AuthenticationService<HierarchicalUserAccount>, SamAuthenticationService<HierarchicalUserAccount>>(); 
container.Register<IUserAccountRepository<HierarchicalUserAccount>>(() => new RavenUserAccountRepository("RavenDb"), Lifestyle.Singleton); 
container.Register<IUserAccountQuery>(() => new RavenUserAccountRepository("RavenDb")); 

在項目替換Ninject排

container.Register<UserAccountService<HierarchicalUserAccount>>(); 

我有一個錯誤 對於容器能夠創建UserAccountService,它應該只包含一個公共的構造,但它有2 參數名:TConcrete

感謝您的幫助。

回答

4

簡單的噴油器迫使你讓你的組件有一個單一的公共構造函數,因爲有multiple injection constructors is an anti-pattern

如果UserAccountService是您的代碼庫的一部分,您應該刪除不應該用於自動佈線的構造函數。

如果UserAccountService是可重複使用庫的一部分,則應該防止在該情況下使用容器的自動佈線功能,如here所述。在這種情況下,你應該退回到自己的佈線類型,讓你的代碼調用到適當的構造函數,例如:

container.Register<UserAccountService<HierarchicalUserAccount>>(() => 
    new UserAccountService<HierarchicalUserAccount>(
     container.GetInstance<MembershipRebootConfiguration<HierarchicalUserAccount>>(), 
     container.GetInstance<IUserAccountRepository<HierarchicalUserAccount>>())); 
+1

謝謝史蒂芬。 – MaxD 2014-12-04 12:14:46

+0

是不是要將UserAccountService對象的生存期設置爲單實例? – pmbanugo 2015-08-05 16:30:31

+0

@pmbanugo:沒有。這是暫時的。 – Steven 2015-08-05 17:38:14

0

我只是要在這裏包括我如何轉換的Ninject配置簡單的噴油器的MembershipReboot存儲庫(我克隆)中的單租戶示例。我認爲這對那些正在尋找如何解決這個問題的人來說可能是有益的,因爲這可能會爲他們節省一些時間。

首先,在單租戶樣品的NinjectWebCommon類的配置是:

var config = MembershipRebootConfig.Create(); 
kernel.Bind<MembershipRebootConfiguration>().ToConstant(config); 
kernel.Bind<DefaultMembershipRebootDatabase>().ToSelf(); 
kernel.Bind<UserAccountService>().ToSelf(); 
kernel.Bind<AuthenticationService>().To<SamAuthenticationService>(); 
kernel.Bind<IUserAccountQuery>().To<DefaultUserAccountRepository>().InRequestScope(); 
kernel.Bind<IUserAccountRepository>().To<DefaultUserAccountRepository>().InRequestScope(); 

現在,我將闡述整個SimpleInjectorInitializer類,從而拉開了其通過SimpleInjector添加到項目中的一個.MVC3 NuGet包,並按照與評論:

public static class SimpleInjectorInitializer 
{ 
    /// <summary>Initialize the container and register it as MVC3 Dependency Resolver.</summary> 
    public static void Initialize() 
    { 
     var container = new Container(); 
     container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 

     container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 

     InitializeContainer(container); 

     container.Verify(); 

     DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 
    } 

    private static void InitializeContainer(Container container) 
    { 
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<DefaultMembershipRebootDatabase, BrockAllen.MembershipReboot.Ef.Migrations.Configuration>()); 

     var config = MembershipRebootConfig.Create(); 
     container.Register(() => config, Lifestyle.Singleton); 
     container.Register(() => new DefaultMembershipRebootDatabase(), Lifestyle.Scoped); 

     container.Register<IUserAccountQuery, DefaultUserAccountRepository>(Lifestyle.Scoped); // per request scope. See DefaultScopedLifestyle setting of container above. 
     container.Register<IUserAccountRepository, DefaultUserAccountRepository>(Lifestyle.Scoped); 

     container.Register(() => new UserAccountService(container.GetInstance<MembershipRebootConfiguration>(), container.GetInstance<IUserAccountRepository>())); 
     container.Register<AuthenticationService, SamAuthenticationService>(); 

     var iUserAccountQueryRegistration = container.GetRegistration(typeof(IUserAccountQuery)).Registration; 
     var iUserAccountRepositoryRegistration = container.GetRegistration(typeof(IUserAccountRepository)).Registration; 

     iUserAccountQueryRegistration.SuppressDiagnosticWarning(DiagnosticType.TornLifestyle, "Intend for separate Objects"); 
     iUserAccountRepositoryRegistration.SuppressDiagnosticWarning(DiagnosticType.TornLifestyle, "Intend for separate Objects"); 
    } 
} 

劃定範圍的配置到一個Singleton有出廠FUNC幾乎是一樣的Ninject的ToConstant。 DefaultMembershipRebootDatabase是顯而易見的出發點,但我真的不認爲MR的DefaultMembershipRebootDatabase的作用域是瞬變還是每個Web請求都不重要。每次執行操作時它都調用SaveChanges,例如,註冊用戶。它不會使用更大,每個請求綁定的轉義。因此,稍後在相同的請求中使用相同的DefaultMembershipRebootDatabase上下文不會導致任何奇怪的MR問題。

然而,如果您想在創建MR UserAccount的同一操作中創建域用戶,會發生什麼情況需要考慮。 (域名用戶可能包含除密碼以外的更多信息,例如名字和姓氏,DOB等)。將MR UserAccount綁定到域用戶(具有諸如姓名,地址等附加用戶信息)是常見用例。那麼,如果在創建MR UserAccount成功後域用戶的創建失敗,會發生什麼情況?我不知道。也許作爲回滾的一部分,您刪除MR用戶。但註冊郵件已經發送。所以,這些是你在這裏面臨的問題。

如您所見,在Simple Tenant示例中,Brock將IUserAccountRepository和IUserAccountQuery註冊到DefaultUserAccountRepository。這顯然是設計的,所以如果我們想要使用MR的UserAccountService和AuthenticationService,我們也必須這樣做。因此,我們需要抑制否則會阻止容器驗證的診斷警告。

希望所有的幫助,並通過一切手段讓我知道,如果我的註冊有問題。

乾杯

相關問題