Служба против хранилища - PullRequest
6 голосов
/ 05 июля 2010

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

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

против

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

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

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

interface ICustomerRepository
{
    ICustomerList GetCustomers();
}

class CustomerRepository : ICustomerRepository
{
    public ICustomerList GetCustomers()
    {...}
}

1 Ответ

4 голосов
/ 05 июля 2010

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

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

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

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;
    }
}
...