实体框架4,Ninject 3,MVC3 目前在我的网络应用程序中,我一直在对每个请求实例化对象上下文使用一种相当基本的方法。所以我正在尝试使用Ninject和一些旧的示例代码,但我不确定如何继续下面的操作。 实际上,我希望能够在控制器中执行以下操作:DB_Entities.Current.Albums ...我应该每次实例化一个StandardKernel吗? 我正在查看的示例使用以下内容:MvcApplication.Container.Get();但在使用App_Start连接的Ninject 3中,我无法访问Container ..
我尝试复制上述行,在运行时失败。
using MusicStoreEntities;
using Ninject;
using TestMVC3WithIOC.App_Start;
using System.Data.Objects;
namespace TestMVC3WithIOC.Models
{
public partial class MusicStoreEntities
{
public static MusicStoreEntities Current
{
get
{
using (IKernel kernel = new StandardKernel())
{
return (MusicStoreEntities)kernel.Get<ObjectContext>();
}
}
}
}
}
另外,请注意,在App_Start \ NinjectWebCommon.cs中,我有以下修改:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ILogger>().To<NLogger>();
kernel.Bind<ObjectContext>().To<MusicStoreEntities>().InRequestScope();
}
答案 0 :(得分:0)
虽然这是一个可行的解决方案,但将整个内核传递给一个类似乎是不明智的,因为它往往会掩盖类的实际特定依赖。更好的方法是将工厂依赖项传递给控制器的构造函数。
public partial class MusicStoreEntities
{
private readonly IEntitiesFactory _factory;
public MusicStoreEntities(IEntitiesFactory factory)
{
_factory = factory;
}
}
IEntitiesFactory
使用单个方法GetObjectContext()
进行简单实现。
(我也相信“工作单位”模式目前很受欢迎,但由于我没有使用它,我无法真正说出来。也许值得研究。)