我正在使用Entity Framework 5(使用edmx)在asp.net mvc 4中工作。我试图让Ninject正常工作,但使用绑定让我很困惑。我之前看过Ninject,但那是在WCF项目中,在WCF层中设置了DI。
现在我有4层:
现在这里是棘手的部分:我想在这里使用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的新手,我只看到它在现有的应用程序中使用。
答案 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的引用。