2017-08-07 75 views
0

的DbContext註冊記憶是否可以注入正確的類型而無需在Unity配置中構造或解析它的實例?

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配置中構造或解析它的實例?

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'的當前實例,但是如果您想從統一配置中移動它,您可能應該有'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

Dang。我只是想通過'InjectionFactory'來做到這一點,但這看起來好簡單得多。 – Shelby115

相關問題