Asp.net mvc 在分层asp.net mvc应用程序和实体框架edmx中使用ninject

Asp.net mvc 在分层asp.net mvc应用程序和实体框架edmx中使用ninject,asp.net-mvc,dependency-injection,ninject,Asp.net Mvc,Dependency Injection,Ninject,我在asp.NETMVC4中使用实体框架5(使用edmx)。我试图让Ninject正常工作,但使用绑定让我感到非常困惑。我以前见过Ninject被使用,但那是在一个WCF项目中,DI被设置在WCF层中 现在我有4层: DataAccess(包含edmx和存储库,我将在后面介绍) 业务逻辑(标准BL) 通用(型号) Gui(mvc4项目) 现在有一个棘手的部分:我想在这里使用DI。我在以前的WCF项目中看到它的使用方式是,我的WCF层转到了我的DataAccess,这样我就可以使用kernel

我在asp.NETMVC4中使用实体框架5(使用edmx)。我试图让Ninject正常工作,但使用绑定让我感到非常困惑。我以前见过Ninject被使用,但那是在一个WCF项目中,DI被设置在WCF层中

现在我有4层:

  • DataAccess(包含edmx和存储库,我将在后面介绍)
  • 业务逻辑(标准BL)
  • 通用(型号)
  • Gui(mvc4项目)
现在有一个棘手的部分:我想在这里使用DI。我在以前的WCF项目中看到它的使用方式是,我的WCF层转到了我的DataAccess,这样我就可以使用kernel.bind了。
现在我不想在这里。我没有使用WCF。我也不想在Gui中调用DataAccess

因为我说过我会展示一些代码来了解:

数据访问中的存储库

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

        public IQueryable<PictureSource> PictureSource
        {
            get { return context.PictureSource; }
        }
    }
公共类回购:IRepo
{
实体上下文=新实体();
公共IQueryable图片资源
{
获取{return context.PictureSource;}
}
}
我的假设是:

public interface IRepository
    {
        IQueryable<PictureSource> PictureSource { get; }
    }
公共接口IRepository
{
IQueryable PictureSource{get;}
}
我希望能够做到的是我的业务逻辑。我希望能够做到以下几点:

public List<Picture> GetStuff(IRepository Repo)
        {
          //code
        }
public List GetStuff(IRepository Repo)
{
//代码
}
现在我在网上查了很多。大约80%的示例使用Web Apim,这对我来说是无用的。另外20%的人似乎做他们想做的任何事情,“因为这只是一个演示”,并且违反了Gui BLDA原则。我见过一些示例,这些示例由一个层组成,用于在数据访问中执行业务逻辑。
ninject wiki对我也没有帮助,因为我是DI新手,我只看到它在现有的应用程序中使用。

尝试使用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);
  }
 }

这将加载当前目录中所有
.dll
s中的
NinjectModule
s。因此,您不需要添加对DAL的引用。

问题是,我必须在Gui中引用我的数据访问,这很糟糕(我在过去几年中一直被告知这一点)。通常,您有一个引导程序。您可以在其中注册所有绑定。引导程序具有对数据访问层的引用。您的GUI应该依赖于您的IRepo,而不是数据访问层。是的,但是我的IRepository也在我的数据访问中。我这样做可能是做错了什么?那么你是说你的项目/dll布局?如果您不想引用数据访问,请将您的接口移动到第三个项目(例如Common),并从GUI和数据访问中引用此项目。啊,现在突然有了意义。我现在在我的数据访问中有了我的IRepository,我只需要将它转移到我的公共数据库。我一直认为它们是同一事物的两部分,但现在我明白了。我对接口的缺乏经验导致了这一点。谢谢你的回答,你现在帮助我澄清了很多。
MVC4 (GUI)
 -> DataAccess
 -> BusinessLogic
 -> Common

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

BusinessLogic
 -> Common (including your Interfaces!)

DataAccess
 -> Common
IKernel kernel = new StandardKernel();
kernel.Load("*.dll");