4

IOC Simple Injector を使用するプロジェクトにメンバーシップの再起動 (RavenDb) を追加する必要があります

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"));

行に

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

コンテナで UserAccountService を作成できるようにするには、1 つのパブリック コンストラクタを含める必要がありますが、2 つあるというエラーがあります。 パラメータ名: TConcrete

ご協力いただきありがとうございます。

4

2 に答える 2

4

Simple Injector では、複数のインジェクション コンストラクターを持つことはアンチパターンであるため、コンポーネントに 1 つのパブリック コンストラクターを持たせる必要があります。

がコード ベースの一部である場合はUserAccountService、自動配線に使用しないコンストラクタを削除する必要があります。

が再利用可能なライブラリの一部である場合は、こちらでUserAccountService説明されているように、コンテナの自動配線機能を使用しないようにする必要があります。その場合、フォールバックして型を自分で配線し、コードで適切なコンストラクターを呼び出せるようにする必要があります。たとえば、次のようになります。

container.Register<UserAccountService<HierarchicalUserAccount>>(() =>
    new UserAccountService<HierarchicalUserAccount>(
        container.GetInstance<MembershipRebootConfiguration<HierarchicalUserAccount>>(),
        container.GetInstance<IUserAccountRepository<HierarchicalUserAccount>>()));
于 2014-12-04T12:06:52.893 に答える
0

ここでは、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 を使用する場合は、これも行う必要があります。したがって、コンテナの検証を妨げる診断警告を抑制する必要があります。

登録に問題がある場合は、ぜひお知らせください。

乾杯

于 2016-05-01T04:22:39.960 に答える