【问题标题】:How to inject a single factory instance to multiple repositories and unit of work using ninject?如何使用 ninject 将单个工厂实例注入多个存储库和工作单元?
【发布时间】:2012-01-31 16:18:53
【问题描述】:

首先,我有一个定义为 public class DatabaseFactory : Disposable, IDatabaseFactory 的 dbcontext 工厂,如果上下文不存在,它只会创建一个上下文。

接下来,我有一个定义为public class Repository<T> : IRepository<T> where T : class 的通用存储库,它采用构造函数中的工厂。我还有其他继承自这个的具体存储库。

我还有一个定义为 public class UnitOfWork : IUnitOfWork 的工作单元类,它在构造函数中获取工厂并将所有更改保存到工厂内的上下文(所有存储库都应该使用)。

在我的控制器中,我将构造函数设置为public ProjectController(IDatabaseFactory factory, IUnitOfWork unitOfWork, IProjectRepository projectRep, IUserRepository userRep)。

基本上,我需要将相同的工厂实例传递给工作单元和所有存储库。使用 ninject,它为每个对象创建一个新工厂,而不是将单个实例传递给所有对象。有没有办法只允许通过 ninject 传递单个实例,或者我没有正确创建我的工厂和/或没有正确理解 ninject?

这是我在 ninject 中的绑定:

kernel.Bind<IProjectRepository>().To<ProjectRepository>();
kernel.Bind<IIssueRepository>().To<IssueRepository>();
kernel.Bind<IUserRepository>().To<UserRepository>();
kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>();
kernel.Bind<IUnitOfWork>().To<UnitOfWork>();

【问题讨论】:

    标签: c# asp.net-mvc ninject


    【解决方案1】:

    这是因为默认情况下 Ninject 使用 Transient 范围 - 每次请求类型时都会创建一个新实例。

    更多信息: https://github.com/ninject/ninject/wiki/Object-Scopes

    您应该根据整个应用程序中某个类型的特定实例的实际使用情况来指定范围:

    示例可能如下所示:

    kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InSingletonScope();
    kernel.Bind<IUserRepository>().To<UserRepository>().InRequestScope();
    

    【讨论】:

    • 真的吗?在过去的一个半小时里,我试图寻找那个答案。这正是我一直在寻找的。我不知道为什么很难通过谷歌找到答案。也许我试图让它变得更加困难。再次感谢!
    • 如果你觉得我的帖子有用,你可以接受它作为答案:)
    • 我会的 - 你回答得太快了,现在我必须等待 4 分钟 :) 谢谢。如果您有第二个问题,如果我将工厂设置为单例 - 它会在当前控制器范围内创建单实例应用程序还是仅在当前控制器内创建一个快速问题?如果我想要一个与 ProjectController 不同的 IssueController 工厂实例(但在该特定控制器中只有一个实例),ninject 会为我解决这个问题吗?
    • Singleton Scope 将在整个应用程序中只创建一个实例 - 因此所有控制器都将收到完全相同的引用。如果您想在控制器中使用不同的实例,您应该考虑使用Request Scope 或Transient Scope - 请注意您的控制器将为每个请求重新创建。你应该玩弄它,看看什么最适合你! :)
    • 这实际上在我的应用程序中运行良好,所以我不需要从 Singleton 更改范围。再次感谢您的快速回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多