我有一个像这样定义的服务:
public class MentorService : IMentorService
{
private readonly Func<MentorContext> _dbFactory;
public MentorService(string connectionString)
{
this._dbFactory = () => new MentorContext(connectionString);
}
public MentorService()
{
this._dbFactory = () => new MentorContext();
}
public MentorContext CreateContext()
{
return _dbFactory.Invoke();
}
public IList<User> GetUsers()
{
using (var db = CreateContext())
{
return db.Users.ToList();
}
}
// etc etc
}
在我的API控制器中,我有以下内容:
public class UserController : ApiController
{
private readonly IMentorService _mentorService;
public UserController()
{
_mentorService = new MentorService();
}
public UserController(IMentorService mentorService)
{
_mentorService = mentorService;
}
}
我想将服务分解为子服务以便于维护和测试 - 比如UserService,BookService等。然后我只想在我的控制器中使用单个服务。
如何做到这一点?
答案 0 :(得分:1)
对于这类事情,我是工厂的忠实粉丝。
(请注意,我假设您有某种DI / IoC设置,考虑到您有基于接口的示例)
基本上,您首先将代码拆分为单独的类UserService
,BookService
等。完成后,您将创建一个为您创建这些服务的工厂。像这样:
public class UserControllerServiceFactory : IUserControllerServiceFactory {
public IUserService CreateUserService() {
return _container.Get<IUserService>();
}
public IBookService CreateBookService() {
return _container.Get<IBookService>();
}
// etc.
}
我们使用Ninject作为DI / IoC,并且更喜欢使用Ninject的工厂扩展。这意味着我们不必自己实现工厂..我们只定义接口。
然后你将工厂注入你的控制器:
public UserController(IUserControllerServiceFactory factory) {
_factory = factory;
}
然后,您的行动方法使用工厂来访问您需要的服务:
[HttpGet]
public ActionResult ViewAllBooks() {
return View(_factory.CreateBookService().GetAll());
}
等
我希望这就是你的意思。