是否可以在不在统一配置中构造或解析它的实例的情况下注入正确的类型?

Is it possible to inject the proper type without constructing or resolving an instance of it in the unity config?

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 类型而不在统一配置中构造或解析它的实例?

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")

您可以使用 ResolvedParameter InjectionMember 表示您希望稍后解析该值。将创建一个解析器,它将使用名称和类型在解析时获取依赖项。

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")
    }));

如果您使用注入工厂,您会进行编译时检查以确保构造函数参数的类型正确。