从MVC项目中的Controller访问服务层

时间:2013-02-17 23:17:26

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我之前有一个控制器,其代码如下:

public ActionResult Method(int Id)
        {
            var foo = doThis(Id)
            return View("Error");
        }

doThis()是一种存在于控制器中的方法,并执行一些逻辑。我现在正在尝试将所有业务逻辑重定位到包含一堆类的Services项目。

首先,我添加了一个类库Project.Services,然后添加了一个类FooServices,其中包含以下内容:

namespace Project.Services
{
    class FooServices
    {
        public List<Bar> doThis(int Id)
        {
            //Do stuff
            return parentSets;
        }
    }
}

我已经从我的MVC项目中添加了对此项目的引用,以及从此Services项目到我的数据模型项目的引用,但我不知道如何继续。如何从控制器访问这些方法?

1 个答案:

答案 0 :(得分:4)

  

如何从控制器访问这些方法?

要访问实例方法,您需要对象的实例:

public ActionResult Method(int Id)
{
    var foo = new FooServices().doThis(Id)
    return View("Error");
}

当然,通过这样做,您现在将控制器逻辑与服务的特定实现强烈耦合,使得单独对控制器进行单元测试非常困难。

因此,通过引入抽象来弱化耦合开始:

public interface IFooServices
{
    List<Bar> DoThis(int id)
}

然后让您的服务层实现此接口:

public class FooServices: IFooServices
{
    public List<Bar> DoThis(int id)
    {
        //Do stuff
        return parentSets;
    }
}

好的,现在你的控制器可以使用这种抽象:

public class HomeController: Controller
{
    private readonly IFooServices service;
    public HomeController(IFooServices service)
    {
        this.sevrice = service;
    }

    public ActionResult Method(int id)
    {
        var foo = this.service.DoThis(id)
        return View("Error");
    }
}

很好,在这个阶段,我们的控制器和服务层之间确实存在弱耦合。现在剩下的就是配置你最喜欢的依赖注入框架,将特定服务注入你的控制器。