1

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

现在我有4层:

  • DataAcces(包含 edmx 和存储库,我稍后会展示)
  • 业务逻辑(标准 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 新手,而且我只看到它在现有应用程序中使用。

4

2 回答 2

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 负责将您的 Repository 注入您的 BusinessLogic 类。

请注意,您的 IRepo 中有一个 IQueryable,您应该避免使用它 ( 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
于 2012-09-27T10:33:25.767 回答
0
IKernel kernel = new StandardKernel();
kernel.Load("*.dll");

这应该在当前目录NinjectModule中的所有s 中加载s。.dll所以你不需要添加对 DAL 的引用。

于 2013-09-01T16:43:41.033 回答