如何将庞大的service.cs文件分解为多个较小的服务?

时间:2013-09-17 22:36:27

标签: c# asp.net asp.net-mvc asp.net-web-api

我有一个像这样定义的服务:

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

如何做到这一点?

1 个答案:

答案 0 :(得分: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());
}

我希望这就是你的意思。