1

我以前有一个控制器,它的代码如下:

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 项目中添加了对这个项目的引用,并从这个 Services 项目中添加了对我的数据模型项目的引用,但我现在不知道如何继续。如何从控制器访问这些方法?

4

1 回答 1

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

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

于 2013-02-17T23:20:34.547 回答