[英].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.