2013-09-17 2 views
0

У меня есть определенный сервис, как это:Как разбить огромный файл service.cs на несколько меньших сервисов?

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

... не можете ли вы разделить связанные функции на отдельные классы? .. Я не уверен на 100%, что у вас возникают проблемы с .. можете ли вы уточнить? –

+0

@SimonWhitehead Как разбить массивный класс функций на подклассы, хотя я все еще могу ссылаться только на один класс. Я знаю, что это простой вопрос C#, но я не знаю синтаксиса:/ – SB2055

ответ

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

т.д.

Надеюсь, это то, что вы имели в виду.

+0

Вам не нужен Ninject .. Я просто упомянул, что мы используем расширение Factory for Ninject для автоматического выполнения этого для нас. Принцип тот же .. создайте класс Factory, который создает для вас сервисы. Тогда вы можете открыть Factory как свойство вашего MentorService .. хотя я, вероятно, не сделал бы этого так. –

Смежные вопросы