了解依赖注入,MVC nTier应用程序中的IoC

时间:2016-09-08 20:00:55

标签: c# dependency-injection asp.net-mvc-5 ninject inversion-of-control

我理解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层返回数据,而所有三层都松散耦合。

2 个答案:

答案 0 :(得分:0)

我假设您没有创建ninject配置文件。所以我们就是这样做的。

解释我在做什么。您需要让您的具体类实现您想要使用的任何接口。

在ninject配置文件中,您需要将接口绑定到具体类。然后你可以调用ninject来获取你的接口,它将返回你想要的具体类。

如果要在N-tier开发环境中使用它。

DAL< - > BL< - > UI

我们将ninject配置卡在了BL中。由于B1是唯一引用DAL的层。我们通过引用将DAL接口/具体类暴露给BL。然后在BL中我们添加了Ninject配置。

一旦在UI中完成,我们就能够访问所有的Business对象。

ninject starter tutorial

<强> 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);
    }
}