2017-08-07 8 views
0

DbContext登録ユニティ設定でそのインスタンスを構築したり解決したりせずに正しいタイプを挿入することは可能ですか?

container.RegisterType<DbContext, MobileEntities>(GetLifetime()); 
container.RegisterType<DbContext, AuthenticationEntities>("AuthDb", GetLifetime()); 

汎用リポジトリ登録

container.RegisterType(typeof(IReadOnlyRepository<>), typeof(ReadOnlyRepository<>), GetLifetime()); 
container.RegisterType(typeof(IReadOnlyRepository<>), typeof(ReadOnlyRepository<>), "ReadOnlyAuth", GetLifetime(), new InjectionConstructor(
    container.Resolve<DbContext>("AuthDb") 
)); 

上記リポジトリは、その唯一のパラメータとしてDbContextをとります。私は、提供されたジェネリックパラメータに基づいて注入したい複数のコンテキストを持っています。 適切なDbContext型をunity config内にインスタンスを構築したり解決したりせずに注入することは可能ですか?

container.RegisterType<IUserPermissionService, UserPermissionService>(GetLifetime(), new InjectionConstructor(
    container.Resolve<IReadOnlyRepository<Customer>>("ReadOnlyAuth"), 
    container.Resolve<IReadOnlyRepository<VisitPlan>>("ReadOnlyAuth"), 
    container.Resolve<IReadOnlyRepository<UserBranch>>("ReadOnlyAuth"), 
    container.Resolve<IReadOnlyRepository<UserRoute>>("ReadOnlyAuth"), 
    container.Resolve<IReadOnlyRepository<UserDriverNumber>>("ReadOnlyAuth"), 
    container.Resolve<IReadOnlyRepository<UserActivity>>("ReadOnlyAuth"), 
    container.Resolve<IReadOnlyRepository<UserRole>>("ReadOnlyAuth") 
)); 

上記Resolve<>コールは、彼らが離れての解決され、登録されるまで実行されないように、私はそれを設定することはできますか?つまり、 'ReadOnlyAuth'を解決する要求が行われたときにのみcontainer.Resolve<DbContext>("AuthDb")を実行するように設定できますか?

+0

'IReadOnlyRepository <>'を解決しようとすると 'DependencyOverride'を使い、' DbContext'の現在のインスタンスを渡すことができますが、unity configからそれを移動したいのであれば 'IUnityContainer'を持っていて、 'IReadOnlyRepository <>' –

答えて

1

ResolvedParameterInjectionMemberを使用して、後で値を解決したいことを示すことができます。解決時に依存関係を取得するために名前と型を使用するリゾルバが作成されます。これらのケースでは

container.RegisterType<IUserPermissionService, UserPermissionService>(
    GetLifetime(), 
    new InjectionConstructor(
     new ResolvedParameter<IReadOnlyRepository<Customer>>("ReadOnlyAuth"), 
     new ResolvedParameter<IReadOnlyRepository<VisitPlan>>("ReadOnlyAuth"), 
     new ResolvedParameter<IReadOnlyRepository<UserBranch>>("ReadOnlyAuth"), 
     new ResolvedParameter<IReadOnlyRepository<UserRoute>>("ReadOnlyAuth"), 
     new ResolvedParameter<IReadOnlyRepository<UserDriverNumber>>("ReadOnlyAuth"), 
     new ResolvedParameter<IReadOnlyRepository<UserActivity>>("ReadOnlyAuth"), 
     new ResolvedParameter<IReadOnlyRepository<UserRole>>("ReadOnlyAuth") 
    )); 

InjectionFactoryも同様に使用することができます。

container.RegisterType<IUserPermissionService, UserPermissionService>(
    GetLifetime(), 
    new InjectionFactory(c => 
    { 
     new UserPermissionService(
      c.Resolve<IReadOnlyRepository<Customer>>("ReadOnlyAuth"), 
      c.Resolve<IReadOnlyRepository<VisitPlan>>("ReadOnlyAuth"), 
      c.Resolve<IReadOnlyRepository<UserBranch>>("ReadOnlyAuth"), 
      c.Resolve<IReadOnlyRepository<UserRoute>>("ReadOnlyAuth"), 
      c.Resolve<IReadOnlyRepository<UserDriverNumber>>("ReadOnlyAuth"), 
      c.Resolve<IReadOnlyRepository<UserActivity>>("ReadOnlyAuth"), 
      c.Resolve<IReadOnlyRepository<UserRole>>("ReadOnlyAuth") 
    })); 

あなたは、射出工場を使用している場合は、コンストラクタの引数が正しいタイプであることを確認するためにチェックする時間をコンパイルするのですか。

+1

ダングの解決。私は 'InjectionFactory'でこれを行うことができたと考えましたが、これははるかに単純なhahaに見えます。 – Shelby115

関連する問題