0

Entity Framework 4, Ninject 3, MVC3 目前在我的 web 应用程序中,我一直在使用一种相当基本的方法来对对象上下文的每个请求实例化。所以我正在尝试使用 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();

    } 
4

1 回答 1

0

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

public partial class MusicStoreEntities
{
    private readonly IEntitiesFactory _factory;

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

IEntitiesFactory有一个简单的实现,只有一个方法GetObjectContext()


(我相信“工作单元”模式目前也很流行,但我不能真正谈论它,因为我没有使用它。也许值得研究。)

于 2012-11-13T17:30:08.747 回答