如何在 asp.net 核心中注入特定的实现

How to inject a specific implementation in asp.net core

我有一个依赖于 User

的存储库

我需要放置 User 的其他实现,我可以那样做,但是用这种方法我不知道如何模拟我的存储库

private readonly IRepository<Entity> _repository;

public SomeClass(MyAppDbContext context)
{
  _repository= new EfRepository<WorkOrder>(context, new User());
}

有没有办法在这里注入User的具体实现,或者如何测试我写的代码

就像将 MyAppDbContext 注入 SomeClass 一样,您也可以注入 User 的实例,例如

private readonly IRepository<Entity> _repository;

public SomeClass(MyAppDbContext context, User user)
{
  _repository= new EfRepository<WorkOrder>(context, user);
}

您可以像这样在 IoC 中注册 User

services.AddTransient<User>();

如果您已经为 User 注册了一个服务并想使用另一个实例,您可以为 SomeClass 注册一个工厂方法来设置 User 实例:

services.AddScoped<SomeClass>(prov => new SomeClass(
  prov.GetRequiredService<MyAppDbContext>(), 
  new User()));

如果你只有少数地方需要特殊实例,工厂方法方法是可行的,否则你可以使用这种方法: 与其他 IoCC 不同,.NET Core IoCC 不支持命名注册,但您也可以使用某种“标记接口”来注册另一个实例:

public interface ISpecialUser : IUser {}

public class User : IUser
{
  // ...
}

public class AnotherUser : ISpecialUser
{
  // ...
}

// ...
public SomeClass(MyAppDbContext context, ISpecialUser user)
{
  _repository= new EfRepository<WorkOrder>(context, user);
}


// ...
services.AddScoped<IUser, User>();
services.AddScoped<ISpecialUser, AnotherUser>();

在测试中,您可以设置一个适合您需要的 User 实例并使用新的构造函数参数。