2017-08-07 19 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

相关问题