コントローラを手動で登録する簡単なインジェクタ
-
20-12-2019 - |
質問
私のアーキテクチャ(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" で終わらなければなりません
何が起こるかを見ることができますソースコードのここで
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);
}
.
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;
.