Сервис по сравнению с репозиторием

Где находится преимущество первого подхода, получая данные о клиентах?

ICustomerService customerService = MyService.GetService<ICustomerService>();
ICustomerList customerList = customerService.GetCustomers();

по сравнению с.

ICustomerRepository customerRepo = new CustomerRepository();
ICustomerList customerList = customerRepo.GetCustomers();

Если Вы поймете мой вопрос, то Вы не спросите, как реализация класса MyService похожа ;-)

вот реализация Repo...

interface ICustomerRepository
{
    ICustomerList GetCustomers();
}

class CustomerRepository : ICustomerRepository
{
    public ICustomerList GetCustomers()
    {...}
}
6
задан Adam Lear 5 July 2010 в 18:06
поделиться

1 ответ

Преимущество первого подхода в том, что используя локатор сервиса, вы можете легко заменить реализацию ICustomerService, если это необходимо. При втором подходе вам придется заменить каждую ссылку на конкретный класс CustomerRepository, чтобы переключиться на другую реализацию ICustomerService.

Еще лучший подход - использовать инструмент инъекции зависимостей, такой как StructureMap или Ninject (есть много других) для управления зависимостями.

Edit: К сожалению, многие типичные реализации выглядят так, поэтому я рекомендую DI framework:

public interface IService {}
public interface ICustomerService : IService {}
public class CustomerService : ICustomerService {}
public interface ISupplerService : IService {}
public class SupplierService : ISupplerService {}

public static class MyService
{
    public static T GetService<T>() where T : IService
    {
        object service;
        var t = typeof(T);
        if (t == typeof(ICustomerService))
        {
            service = new CustomerService();
        }
        else if (t == typeof(ISupplerService))
        {
            service = new SupplierService();
        }
        // etc.
        else
        {
            throw new Exception();
        }
        return (T)service;
    }
}
4
ответ дан 17 December 2019 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: