我有一个带有API的ASP.NET核心MVC项目。
然后我在同一个名为基础设施。
的解决方案中有一个类库我的API在类UserRepository
如果我在API控制器中使用:
private static IMemoryCache _memoryCache;
public Api(IMemoryCache cache) //Constructor
{
_memoryCache = cache;
}
我可以将缓存用于控制器。
但我希望ASP.NET注入相同的引用,以便在基础结构库中的UserRepository
类中使用。
这样我可以通过API调用,像
这样的方法UserRepository.GetUser(Id);
并在UserRepository类中:
namespace Infrastructure
{
public class UserRepository
{
public static User GetUser(Id)
{
**//I want to use the Cache Here**
}
}
}
即使不是控制器,如何告诉ASP.NET将IMemoryCache
注入UserRepository
类?
答案 0 :(得分:3)
依赖注入和static
不能很好地协同工作。选择其中之一,或者你最终会遇到这样的困难。我建议你将UserRepository
添加到依赖注入容器中,将IMemoryCache
添加到构造函数中,并在控制器中注入存储库。
关键是在应用程序的所有层中实现依赖注入,而不仅仅是在Web API层中。
答案 1 :(得分:3)
避免所有(静态单例,活动记录模式和静态类)的具体解决方案:
public class ApiController : Controller
{
private readonly UserRepository_userRepository;
public ApiController(UserRepository userRepository)
{
_userRepository = userRepository;
}
public Task<IActionResult> Get()
{
// Just access your repository here and get the user
var user = _userRepository.GetUser(1);
return Ok(user);
}
}
namespace Infrastructure
{
public class UserRepository
{
public readonly IMemoryCache _memoryCache;
public UserRepository(IMemoryCache cache)
{
_memoryCache = cache;
}
public User GetUser(Id)
{
// use _memoryCache here
}
}
}
// Startup.cs#ConfigureServices
services.AddMemoryCache();