c# - Web API 中长期对象的依赖注入(inject)?

标签 c# asp.net-mvc ninject asp.net-web-api

我正在使用 ASP.NET Web API 和 Ninject 组合一个 REST 服务,尽管我怀疑这可能是一个更普遍的 IoC 问题,而不是我的 IoC 框架的任何特定问题。我有许多对象需要访问用户实体的简单缓存:

public class UserCache
{
    private IList<User> users;
    private IUserRepositoryFactory factory;

    [Inject]
    public UserCache(IUserRepositoryFactory factory)
    {
        this.factory = factory;
        this.users = new List<User>();
    }

    public void Add(int id)
    {
        IUserRepository repo = factory.Create(new TestContext());

        this.users.Add(repo.Get(id));
    }

    public int Count { get { return this.users.Count; } }
}

实际上,缓存是通读的,并且会使用 UserRepository(和关联的 IUserRepository 接口(interface))用用户实体填充自身:

public class UserRepository : IUserRepository
{
    private readonly TestContext context;

    public UserRepository(TestContext context)
    {
        this.context = context;
    }

    public User Get(int id)
    {
        return new User() { Name = "Test User" };
    }
}

缓存是长期存在的,并在整个应用程序中共享。我的问题是:我想使用我的 UserRepository 从我的数据库中提取用户实体。这个存储库需要以某种方式注入(inject)到缓存中,或者使用工厂实例化。

诀窍是,我能够做到的唯一方法是 a) 创建缓存以便 Ninject 将注入(inject)它的依赖项 b) 在整个过程中都可以访问缓存是在单例范围内绑定(bind)缓存并注入(inject)将其放入需要访问它的对象中:

kernel.Bind<TestContext>().ToSelf();
kernel.Bind<UserCache>().ToSelf().InSingletonScope();

...然后在 Controller 中(例如):

[Inject]
public UserCache Cache { get; set; }

我的问题是,这是处理需要注入(inject)的长生命周期对象的最佳方法吗?还是我缺少一些更好的方法?我不想让缓存(或任何其他类似的对象)直接访问 Ninject 内核。

最佳答案

这不应该是相反的吗?你应该在你的 Controller 中使用 IUserRepository 并且引擎盖下的存储库应该从缓存中获取数据(如果使用拦截器完成则更好)如果它已经被缓存,否则应该访问数据库。

这样您就不必担心长期缓存对象的生命周期。请记住,在一天结束时,整个 WebAPI(到目前为止)都在 Web 堆栈上运行,这意味着应用程序可能会根据不同的因素意外回收。

关于c# - Web API 中长期对象的依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12134379/

相关文章:

asp.net - NInject 可以在中等信任托管中工作吗?

c# - 如何将其(参见下面的代码)转换为 C#?

c# - 如何使用 iTextSharp PdfReader 从 PdfFile 获取 UserUnit 属性

c# - 加密 URL 中的路由数据

c# - 未调用 DropCreateDatabaseAlways 种子

c# - 如何在内核找到属性时注入(inject)它

dependency-injection - Ninject:使用 Ninject 注册已创建的实例?

c# - Visual Studio 2012 找不到模板

c# - 如何避免.NET DLL 文件被反汇编?

asp.net-mvc - 使用 ASP.NET MVC 和表单例份验证的不同 URL 的不同登录 URL