【问题标题】:Accessing Service Layer from Controller in MVC Project从 MVC 项目中的控制器访问服务层
【发布时间】:2013-02-17 23:17:25
【问题描述】:

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

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

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

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

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

我已经从我的 MVC 项目中添加了对该项目的引用,并从该服务项目中添加了对我的数据模型项目的引用,但我现在不知道如何继续。如何从控制器访问这些方法?

【问题讨论】:

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


    【解决方案1】:

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

    为了访问一个实例方法,你需要一个对象的实例:

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

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

    【讨论】:

    • 谢谢你解释得很好。
    • 我有以下情况,在我的项目中有十个控制器和十个服务类,每个服务类都涉及业务逻辑。我还有所有控制器中需要的参考数据(国家、供应商、商家和产品名称)。由于我需要在所有控制器中获取参考数据我应该在所有十个服务类(冗余)中编写这些获取方法还是需要创建一个服务类(没有业务逻辑)将其命名为“refservice”与所有获取方法?最好的方法是什么?
    猜你喜欢
    • 2012-11-08
    • 2012-06-17
    • 2012-01-10
    • 1970-01-01
    • 2013-10-30
    • 2012-03-09
    • 2011-01-13
    • 2021-03-19
    • 2014-02-19
    相关资源
    最近更新 更多