ここでは、MembershipReboot リポジトリ (複製したもの) の Single Tenant サンプル用に Ninject 構成を Simple Injector に変換する方法を含めます。時間を節約できるかもしれないので、これをどうするかを探していた人にとっては有益かもしれないと思いました.
まず、Single Tenant サンプルの 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();
ここで、SimpleInjector.MVC3 Nuget パッケージを介してプロジェクトに追加されたものから始まる SimpleInjectorInitializer クラス全体を設定し、コメントでフォローアップします。
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");
}
}
ファクトリ関数を使用して構成をシングルトンにスコープすることは、Ninject の ToConstant とほとんど同じです。DefaultMembershipRebootDatabase は明らかな出発点ですが、正直なところ、MR の DefaultMembershipRebootDatabase が一時的または Web 要求ごとに範囲指定されているかどうかは問題ではないと思います。ユーザーの登録など、操作が実行されるたびに SaveChanges を呼び出します。リクエストにバインドされたトランザクションごとに、より大きなものは使用しません。そのため、後で同じリクエストで同じ DefaultMembershipRebootDatabase コンテキストを使用しても、奇妙な MR の問題が発生することはありません。
ただし、MR UserAccount を作成するのと同じ操作中にドメイン ユーザーを作成する場合はどうなるかを考える必要があります。(ドメイン ユーザーには、姓名、生年月日など、パスワード以外の情報が含まれている場合があります)。MR UserAccount をドメイン ユーザー (名前、アドレスなどの追加のユーザー情報を含む) に関連付けることは、一般的なユース ケースです。では、MR UserAccount の作成が成功した後、ドメイン ユーザーの作成が失敗した場合はどうなるでしょうか? 知らない。おそらくロールバックの一環として、MR ユーザーを削除します。ただし、登録メールはすでに送信されています。したがって、これらはここで直面する問題です。
ご覧のとおり、Simple Tenant サンプルでは、Brock は IUserAccountRepository と IUserAccountQuery の両方を DefaultUserAccountRepository に登録します。これは明らかに設計によるものであり、MR の UserAccountService と AuthenticationService を使用する場合は、これも行う必要があります。したがって、コンテナの検証を妨げる診断警告を抑制する必要があります。
登録に問題がある場合は、ぜひお知らせください。
乾杯