如何在 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
实例并使用新的构造函数参数。
我有一个依赖于 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
实例并使用新的构造函数参数。