当前位置: 首页 > 知识库问答 >
问题:

通过ASP.NET核心依赖注入使用工厂模式

太叔英卫
2023-03-14

我需要ASP。Net核心依赖注入,将一些参数传递给实现ICardPaymentRepository接口的GlobalRepositoryClass的构造函数。

参数是用于配置的,来自配置文件和数据库,我不希望我的类去引用数据库和配置本身。

我认为工厂模式是实现这一点的最佳方式,但我想不出使用工厂类的最佳方式。工厂类本身依赖于配置和数据库。

我的创业公司目前看起来像这样:

public class Startup
{
    public IConfiguration _configuration { get; }
    public IHostingEnvironment _environment { get; }

    public Startup(IConfiguration configuration, IHostingEnvironment environment)
    {
        _configuration = configuration;
        _environment = environment;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IDbRepository, DbRepository>();
        var connection = _configuration.GetConnectionString("DbConnection");
        services.Configure<ConnectionStrings>(_configuration.GetSection("ConnectionStrings"));
        services.AddDbContext<DbContext>(options => options.UseSqlServer(connection));
        services.AddScoped<ICardPaymentRepository, GlobalRepository>();
        ...
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IRFDbRepository rFDbRepository)
    {
     ...
    }
}

GlobalRepository构造函数如下所示:

public GlobalRepository(string mode, string apiKey)
{
}

我现在如何将模式从配置传递,如何将 apiKey 从 DbRepository 传递到 Startup 的构造函数中?

共有3个答案

沈英勋
2023-03-14

我遇到了同样的问题,并通过为IFactory注册一组开放泛型来解决这个问题。

https://github.com/jmg48/useful

https://www.nuget.org/packages/Ariadne.Extensions.ServiceCollection/

https://Jon-glass . medium . com/abstract-factory-support-for-Microsoft-net-dependency-injection-3c 3834894 c 19

谢豪
2023-03-14

您可能还需要检查这些链接。。。

https://github.com/Microsoft/AspNetCoreInjection.TypedFactories

https://espressocoder.com/2018/10/08/injecting-a-factory-service-in-asp-net-core/

关于最后一个链接,代码基本上是:

public class Factory<T> : IFactory<T>
{
    private readonly Func<T> _initFunc;

    public Factory(Func<T> initFunc)
    {
        _initFunc = initFunc;
    }

    public T Create()
    {
        return _initFunc();
    }
}

public static class ServiceCollectionExtensions
{
    public static void AddFactory<TService, TImplementation>(this IServiceCollection services) 
    where TService : class
    where TImplementation : class, TService
    {
        services.AddTransient<TService, TImplementation>();
        services.AddSingleton<Func<TService>>(x => () => x.GetService<TService>());
        services.AddSingleton<IFactory<TService>, Factory<TService>>();
    }
}

我认为温莎城堡的类型化工厂会在自己被处理掉的时候处理掉他们创造的所有东西(这可能并不总是最好的主意),如果你仍然期待这种行为,你可能必须考虑这些链接。当我重新考虑为什么我想要一个工厂时,我最终只是创建了一个包装新的简单工厂,例如:

public class DefaultFooFactory: IFooFactory{
  public IFoo create(){return new DefaultFoo();}
}
狄鸿禧
2023-03-14

注册存储库时使用factory委托重载

//...

string mode = "get value from config";

services.AddScoped<ICardPaymentRepository, GlobalRepository>(sp => {        
    IDbRepository repo = sp.GetRequiredService<IDbRepository>();
    string apiKey = repo.GetApiKeyMethodHere();

    return new GlobalRepository(mode, apiKey);
});

//...

使用 ActivatorUtilities.CreateInstance 的替代方法

//...

string mode = "get value from config";

services.AddScoped<ICardPaymentRepository>(sp => {        
    IDbRepository repo = sp.GetRequiredService<IDbRepository>();
    string apiKey = repo.GetApiKeyMethodHere();

    return ActivatorUtilities.CreateInstance<GlobalRepository>(sp, mode, apiKey);
});

//...
 类似资料:
  • 我的大多数服务通常与crud方法相同

  • 我有一个主要的ASP.NET核心Web API项目,它消耗多个项目,但我遵循清洁架构,所有接口都放在一个核心项目中,有模块项目(基础设施)定义实现。主要项目只是引用核心项目,而不知道基础设施。 这意味着我们需要扫描模块的依赖性,并用核心项目中定义的相应接口自动连接实现。 更具体地说,假设我有一个接口IA(在核心项目中)和一个实现A(在基础设施中),传统上,如果主项目同时引用两者,我们可以像这样手动

  • 复合在这种情况下“消耗”一个子对象数组,从某种意义上说,“吸入”用密钥注册的IFoo的每个实现。这是一个重要的方面:如果您要用一个键注册复合,它将尝试实例化自己,并立即导致StackOverflow异常。 本机DI不支持这些命名注册。 这个例子是从这里提取的

  • 本文向大家介绍依赖注入和工厂模式之间的区别。,包括了依赖注入和工厂模式之间的区别。的使用技巧和注意事项,需要的朋友参考一下 工厂注入和依赖注入都是设计模式,可用于增强软件组件之间的松散耦合能力。  工厂设计模式用于创建对象。但是,对象的注入和生命周期管理应由应用程序内的程序员处理。无法在单个位置配置所有内容。因此,程序员需要在任何需要的地方调用对象创建逻辑,这最终会阻碍松散的耦合能力。 在DI设计

  • 我有一个.NET core项目,并且正在尝试使用授权选项创建自定义策略,如此处的文档所示: ASP.NET.Core授权-需求处理程序中的依赖注入 这些示例显示了使用 1 个参数(一个简单的 int 值)设置授权要求。我的自定义要求需要一个字符串参数以及一个 DbContext 对象。我想在运行时将 DbContext 注入到需求的构造函数中。我正在使用 Autofac 容器。我不确定如何实现这一

  • 我有一个小小的两难问题,涉及到Guice和避免非Guice单例。考虑一个多模块项目,其中有3个模块:、和。和都使用模块内的类的实例(该模块是times方法,并在整个项目中广泛使用)。 几乎每个类都需要使用这个实例(包括在用户连接时动态创建的对象)。 如果每个类都需要类的一个实例,那么不同的方法都有缺点: 解决方案2(仅作为实例字段): 缺点:与上面类似,您必须使用Guice的来实例化每个对象。这意