質問

私のアーキテクチャ(MVC、DDD - ドメインモデル、リポジトリ)への依存性注入を実装しようとしています。そして私のアーキテクチャにはASP.NET ID 2.0が含まれます。

この段階では、ID 2.0オブジェクト(userAdmincontroller、RolesAdmincontroller ...)のいずれかを制御したくありません。私はdiの外のセキュリティオブジェクトを好むでしょう。この段階で、DIのアイデンティティオブジェクトを統合することは非常に困難です。私は誰かがすでにこれをしているかどうかを見てよく見て、私はこれを行う方法を読み、学ぶことができました。私は何も見つけることができませんでした。 (近くになった1つの投稿が見つかりましたが、解像度はありませんでした)。

とにかく、簡単なインジェクタMVCの実装(下記の標準コードを参照)、そして多くのことを試みると、問題は私が RegistermvcControllers を呼び出すことにあると思います。

私が間違っている場合は訂正していますが、このステートメントはすべてのコントローラを「コントローラー」で修正した名前でピックアップします。

質問:どのコントローラをシンプルなインジェクタに登録するかを選択する方法を選択できますか? (これは手動で登録していますか?)

私はこのすべてのまわりで私の頭を取得しようと、今日の大半を費やして、次のステップに進み、すなわちDIが実装している、と私のオブジェクトをインスタンス化してきたようにすべてのヘルプは大幅にいただければ幸いです。

...

...

... Application_Start()から呼び出されました

        // Create a Simple Injector container
        var container = new Container();

        // Configure the container
        InitializeContainer(container);

        container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

        // Verify the container's configuration
        container.Verify();

        DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));


    private static void InitializeContainer(Container container)
    {
        container.Register<MyService1>();            

        container.Register<IMyRepositoryA, MyRepositoryA>();

        // Trying to include Identity into Simple Injector - please ignore
        container.Register<IUserStore<ApplicationUser>>(() => new UserStore<ApplicationUser>(new ApplicationDbContext()));
    }
.

役に立ちましたか?

解決

RegisterMvcControllersは次の種類を登録します。

  • タイプはpublic
  • でなければなりません
  • typeはSystem.Web.Mvc.IController
  • を実装する必要があります。
  • タイプは抽象化されてはいけません
  • タイプは一般的な型定義
  • であってはいけません
  • その名前は "controller"
  • で終わらなければなりません

何が起こるかを見ることができますソースコードのここで

RegisterMvcControllers拡張方法は、登録するコントローラのリストをSimpleInjectorMvcExtensions.GetControllerTypesToRegisterメソッドに呼び出します。次のように登録されているものを見るために自分でその方法を呼び出すことができます。

var registeredControllerTypes =
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly())
.

だからRegisterMvcControllersを呼び出す代わりに、GetControllerTypesToRegisterメソッドを呼び出してコントローラを登録できます。

var registeredControllerTypes = 
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly());

foreach (var controllerType in registeredControllerTypes)
{
    container.Register(controllerType, controllerType, Lifestyle.Transient);
}
.

手動で登録するコントローラを除外することができます。

var registeredControllerTypes = 
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly())
    .Where(type => type.Name != "UserStore`1");

foreach (var controllerType in registeredControllerTypes)
{
    container.Register(controllerType, controllerType, Lifestyle.Transient);
}
.

もう1つのオプションは登録をオーバーライドすることです:

container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

container.Options.AllowOverridingRegistrations = true;

container.Register<IUserStore<ApplicationUser>>(
    () => new UserStore<ApplicationUser>(new ApplicationDbContext()))

// Always set the option back to false ASAP to prevent configuration errors.
container.Options.AllowOverridingRegistrations = false;
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top