首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IServiceCollection覆盖单个构造函数参数

IServiceCollection覆盖单个构造函数参数
EN

Stack Overflow用户
提问于 2016-07-05 16:24:48
回答 3查看 4K关注 0票数 9

我有一个类,它接受三个构造函数参数。在我的组合根目录中,我只想定义/重写(三个构造函数参数中的一个);另外两个依赖项已经映射到我的DI容器中,应该是从IServiceProvider创建的。

有了尼尼特,我可以做这样的事情:

代码语言:javascript
复制
Bind<IMyInterface>().To<MyClass>()    
    .WithConstructorArgument("constructorArgumentName", x => "constructor argument value");

当尼尼莫创建MyClass时,它使用这个字符串参数,并自动为我注入另外两个依赖项。我在.net内核中遇到的问题是,我不能告诉IServiceCollection,我只想指定三个参数中的一个,我必须定义所有参数,或者不定义。例如,在.net核心中,我必须这样做:

代码语言:javascript
复制
services.AddTransient<IMyInterface>(x=> new MyClass("constructor argument value", new Dependency2(), new Dependency3());

我不喜欢创建Dependency2和Dependency3类的新实例;这两个类可以有自己的构造函数参数。我只想让DI管理这些依赖关系。因此,我的问题是-在使用.net类映射IServiceCollection核心中的依赖项时,如何覆盖单个构造函数参数?

如果不能只覆盖一个构造器参数,那么如何使用IServiceCollection解决依赖关系?我试着做这样的事:

代码语言:javascript
复制
services.AddTransient<IMyInterface>(x=> new MyClass("constructor argument value", serviceCollection.Resolve<IDependency2>(), serviceCollection.Resolve(IDependency3>());

但是这是行不通的,我也不知道如何使用IServiceCollection来解决依赖关系。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-05 19:41:44

试试这个:

代码语言:javascript
复制
services.AddTransient<IDependency2, Dependency2Impl>();

services.AddTransient<IDependency3, Dependency3Impl>();

services.AddTransient<IMyInterface>(provider=>
    return new MyClass("constructor argument value",
      provider.GetService<IDependency2>(),
      provider.GetService<IDependency3>());
);
票数 8
EN

Stack Overflow用户

发布于 2019-09-18 11:51:53

对于任何想要通用但灵活的解决方案的人:https://gist.github.com/ReallyLiri/c669c60db2109554d5ce47e03613a7a9

API是

代码语言:javascript
复制
public static void AddSingletonWithConstructorParams<TService, TImplementation>(
            this IServiceCollection services,
            object paramsWithNames
        );
public static void AddSingletonWithConstructorParams(
            this IServiceCollection services,
            Type serviceType,
            Type implementationType,
            object paramsWithNames
        );
public static void AddSingletonWithConstructorParams<TService, TImplementation>(
            this IServiceCollection services,
            params object[] parameters
        );
public static void AddSingletonWithConstructorParams(
            this IServiceCollection services,
            Type serviceType,
            Type implementationType,
            params object[] parameters
        );

用构造函数方法反射实现。

票数 1
EN

Stack Overflow用户

发布于 2018-08-01 14:20:26

示例:

服务中心:

代码语言:javascript
复制
public SkillsService(IRepositoryBase<FeatureCategory> repositoryCategory, int categoryId)

启动:

代码语言:javascript
复制
 services.AddScoped<ISkillsService>(i => new SkillsService(services.BuildServiceProvider().GetService<IRepositoryBase<FeatureCategory>>(), AppSettingsFeatures.Skills));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38208295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档