我理解DI和IoC,但我似乎无法理解如何在nTier应用程序中实现它。这是一个简单的MVC应用程序,我试图用一个域对象构建。
图层:DAL和UI将引用BLL图层。 DAL< - BLL - > UI
DAL将包含EntityFramework,SQLBlogRepository,Blog.cs和Mapper BAL将包含IBlogRepository,Domain对象:Blog.cs UI将实现IBlogRepository的构造函数DI
这就是我被困的地方。我如何使用Ninject以便构造函数知道使用SqlBlogRepository实现?我还遇到了一些使用" Composition Root"这增加了更多的困惑。然后是使用Repository Pattern的示例。最重要的是,我正在尝试实现一个松散耦合并使用IoC /依赖注入的nTier MVC应用程序。请帮我勾画出如何从UI层调用并让DAL层通过BLL层返回数据,而所有三层都松散耦合。
答案 0 :(得分:0)
我假设您没有创建ninject配置文件。所以我们就是这样做的。
解释我在做什么。您需要让您的具体类实现您想要使用的任何接口。
在ninject配置文件中,您需要将接口绑定到具体类。然后你可以调用ninject来获取你的接口,它将返回你想要的具体类。
如果要在N-tier开发环境中使用它。
DAL< - > BL< - > UI
我们将ninject配置卡在了BL中。由于B1是唯一引用DAL的层。我们通过引用将DAL接口/具体类暴露给BL。然后在BL中我们添加了Ninject配置。
一旦在UI中完成,我们就能够访问所有的Business对象。
<强> DAL 强>
public interface IRepository
{
//does some things
}
public SQLBlogRepository : IRepository
{
//implements IRepository
}
<强> BL 强>
NINJECT CONFIGURATION FILE
public Foo : IFOO
{
public Foo(IRepository steve){}
}
public interface IFOO
{
}
public class NinjectConfig : NinjectModule
{
public override void Load()
{
Bind<IRepository>.To<SQLBlogRepository>();
Bind<IFOO>.To<Foo>();
}
}
然后你就这样使用它。
var repo = new StandardKernel(new NinjectConfig()).Get<IRepository>();
var fooManager = new StandardKernel(new NinjectConfig()).Get<IFOO>();
var fooManager
,通过ninject的力量将自动实现你的回购。所以你不需要自己创建它。配置文件将处理构造函数中的所有依赖项。所以你永远不需要知道你需要做什么构造函数创建。您还可以在一个位置更改创建,并通过代码自动将其传播出去。
答案 1 :(得分:0)
在您的示例中,UI(Mvc Project)是您的组合根,您可以在其中配置您的依赖项(使用任何ioc容器,如ninject)。您的mvc项目必须引用BLL和DAL层,并且必须在mvc项目中创建类似@ gh9的映射。
在你的控制器中你有
public class HomeController : Controller
{
private readonly IFOO _fooBll;
public HomeController(IFOO fooBll){
_fooBll=fooBll;
}
public ActionResult Index()
{
return View();
}
}
并且您必须拥有一个控制器工厂来解决您的控制器依赖关系,如:
public class NinjectControllerFactory : DefaultControllerFactory
{
private IKernel ninjectKernel;
public NinjectControllerFactory()
{
ninjectKernel = new StandardKernel();
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return controllerType == null
? null
: (IController) ninjectKernel.Get(controllerType);
}
}