繁体   English   中英

.Net核心依赖注入-带参数

[英].Net core Dependency injection - with parameters

注意:此示例已简化

我有一个“客户的联系人”表,想从数据库中检索特定的客户联系信息。 我输入belove的代码为我带来了所有联系方式。 我只想使用一个参数来带给我特定的客户联系人。

我这样使用了IClientContactRepository接口

public interface IClientContactRepository
{
    IQueryable<ClientContactModel> ClientContacts { get; }
}

我使用此类通过dapper从数据库中检索数据

public class ClientContactRepository : IClientContactRepository
{
    private readonly IConfiguration configuration;
    private List<ClientContactModel> ClientContactList {get;set;}


    public ClientContactRepository(IConfiguration config)
    {
        configuration = config;

        SqlConnection conn = new SqlConnection(configuration["ConnectionString"]);

        using (var connection = conn)
        {
            ClientContactList = connection.Query<ClientContactModel>("Select * FROM ContactTable ").ToList();
        }
    }
    public IQueryable<ClientContactModel> ClientContacts => ClientContactList;
}

在我的创业课上

  services.AddTransient<IClientContactRepository, ClientContactRepository>();

我的问题是:我可以将客户端的id参数传递给构造函数。

我试过了:向构造函数添加一个参数

  public ClientContactRepository(IConfiguration config, int clientId)

并尝试开始上课。

 services.AddTransient<IClientContactRepository, ClientContactRepository(int,i)>()

没用...。有人可以帮我传递参数吗?

是的,但是您从哪里获得客户端ID-它是在应用程序生命周期内是静态的配置值吗? 如果是这样,则可以使用接受工厂委托来创建对象的AddTansient方法重载。

更好的方法(将涵盖所有用例)是在DI容器中注册可以提供该信息的类型(如果不存在这种类型,则创建一个),并将其用作存储库构造函数中的参数。

举例来说,假设您从索赔中获得了客户ID,所以您需要注入的类型是IPrincipal:

services.AddScoped<IPrincipal>(
    provider => provider.GetService<IHttpContextAccessor>()
        .HttpContext
        .User);

然后,您可以将IPrincipal注入您的repo构造函数中并检索客户端ID。 更好的方法是创建自己的类型“ ClientIdAccessor”,该类型负责提供客户端ID。 这样,在测试存储库时就不会依赖IPrincipal,并且这种新类型的实现将仅依赖于ASP.NET核心实现的外部库。

旁注:您确定要为回购使用AddTransient吗? 通常,您希望在请求的生存期内使用相同的回购对象(即AddScoped)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM