使用带有分层asp.net mvc应用程序和实体框架edmx的ninject

时间:2012-09-27 09:21:01

标签: asp.net-mvc dependency-injection ninject

我正在使用Entity Framework 5(使用edmx)在asp.net mvc 4中工作。我试图让Ninject正常工作,但使用绑定让我很困惑。我之前看过Ninject,但那是在WCF项目中,在WCF层中设置了DI。

现在我有4层:

  • DataAcces(包含edmx和存储库,我稍后会介绍)
  • BusinessLogic(标准BL)
  • 普通(模特)
  • Gui(mvc4项目)

现在这里是棘手的部分:我想在这里使用DI。我在之前的WCF项目中看到它的使用方式是我的WCF层转到了我的DataAccess,所以我可以使用kernel.bind。
现在我不想要这个。我没有使用WCF。我也不想在我的Gui中调用我的DataAccess。

因为我说我会展示一些洞察力的代码:

DataAccess中的存储库

public class Repo: IRepo
    {
        Entities context = new Entities();

        public IQueryable<PictureSource> PictureSource
        {
            get { return context.PictureSource; }
        }
    }

我的IRepository就是这样:

public interface IRepository
    {
        IQueryable<PictureSource> PictureSource { get; }
    }

我希望能够做的是在我的BusinessLogic中。我希望能够做到以下几点:

public List<Picture> GetStuff(IRepository Repo)
        {
          //code
        }

现在我在互联网上看了很多。大约80%的例子都使用Web Apim,这对我来说毫无用处。其他20%似乎只是做他们想做的事情“因为它只是一个演示”并违反了Gui-BL-DA原则。我见过的例子包括单个层到在数据访问中执行业务逻辑的示例。 ninject wiki也没有帮助我,因为我是DI的新手,我只看到它在现有的应用程序中使用。

2 个答案:

答案 0 :(得分:2)

尝试使用Poor-Man's-DI进行编码。在构造函数中注入依赖项!

public class BusinessLogic
{ 
  private _repository;

  public BusinessLogic(IRepo repository) 
  { 
     _repository = repository;
  }

  public List<Picture> GetStuff()
  {
      _repository.PictureSource.Where(x=>x.Published == false);
  }
 }

如果您的代码库正确,请在Ninject中注册您的依赖项。 Ninject然后注意将您的存储库注入您的BusinessLogic类。

请注意您的IRepo中有IQuery,您应该避免(http://www.infoq.com/news/2012/03/IQueryable-api

编辑: 这将是您的解决方案结构和参考:

MVC4 (GUI)
 -> DataAccess
 -> BusinessLogic
 -> Common

You need to setup this references, to wire up your bindings.

BusinessLogic
 -> Common (including your Interfaces!)

DataAccess
 -> Common

答案 1 :(得分:0)

IKernel kernel = new StandardKernel();
kernel.Load("*.dll");

这应该在当前目录的所有NinjectModule中加载.dll。因此,您无需添加对DAL的引用。