我之前有一个控制器,其代码如下:
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项目到我的数据模型项目的引用,但我不知道如何继续。如何从控制器访问这些方法?
答案 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");
}
}
很好,在这个阶段,我们的控制器和服务层之间确实存在弱耦合。现在剩下的就是配置你最喜欢的依赖注入框架,将特定服务注入你的控制器。