ninject 3渲染出对象上下文实例

时间:2012-11-13 17:17:05

标签: asp.net-mvc-3 entity-framework-4 ninject

实体框架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();

    } 

1 个答案:

答案 0 :(得分:0)

虽然这是一个可行的解决方案,但将整个内核传递给一个类似乎是不明智的,因为它往往会掩盖类的实际特定依赖。更好的方法是将工厂依赖项传递给控制器​​的构造函数。

public partial class MusicStoreEntities
{
    private readonly IEntitiesFactory _factory;

    public MusicStoreEntities(IEntitiesFactory factory)
    {
        _factory = factory;
    }
}

IEntitiesFactory使用单个方法GetObjectContext()进行简单实现。


(我也相信“工作单位”模式目前很受欢迎,但由于我没有使用它,我无法真正说出来。也许值得研究。)