0

我有这样定义的服务:

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 等。然后我只想在我的控制器中使用一个服务。

如何才能做到这一点?

4

1 回答 1

1

我是这类事情的工厂的忠实粉丝。

(请注意,我假设您有某种 DI/IoC 设置,考虑到您有一个基于接口的示例)

基本上,您首先将代码拆分为单独的类UserServiceBookService等等。一旦您完成了这些,您将创建一个为您创建这些服务的工厂。像这样的东西:

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

等等

我希望这就是你的意思。

于 2013-09-17T22:52:05.593 回答