我只是要在這裏包括我如何轉換的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,我們也必須這樣做。因此,我們需要抑制否則會阻止容器驗證的診斷警告。
希望所有的幫助,並通過一切手段讓我知道,如果我的註冊有問題。
乾杯
謝謝史蒂芬。 – MaxD 2014-12-04 12:14:46
是不是要將UserAccountService對象的生存期設置爲單實例? – pmbanugo 2015-08-05 16:30:31
@pmbanugo:沒有。這是暫時的。 – Steven 2015-08-05 17:38:14