控制器外的IMemoryCache依赖注入

时间:2016-12-03 10:09:21

标签: c# asp.net-core asp.net-core-mvc

我有一个带有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类?

2 个答案:

答案 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();