Понятие, которое вам нужно, называется IoC / DI, и для этого есть много платформ.Когда у вас есть такой класс, как CustomerService, и вам нужен CustomerRepository, по определению это зависимость, и вы должны передать его через конструктор CustomerService - но тогда возникает вопрос, где вы будете создавать экземпляр CustomerService?Ну, кто использует этот сервис, должен получить его и через конструктор, это может быть CustomerPresenter или какой-то другой класс, не относящийся к делу.Моя точка зрения заключается в том, что при внедрении зависимостей вы структурируете свой код в одну точку, где инфраструктура IoC / DI разрешает эти зависимости в соответствии с вашими правилами.
В самом начале программы у вас будет что-то вроде:
ICustomerPresenter presenter = IoC.Resolve<ICustomerPresenter>();
и все автоматически объединится за кулисы.
Чтобы достичь этого, вот пример со StructureMap:
For<ICustomerPresenter>().Use<CustomerPresenter>();
For<ICustomerService>().Singleton().Use<CustomerService();
For<ICustomerRepository>().Singleton().Use<CustomerRepository>();
С этим высохранить тестируемостьЗдесь я многое упростил, так что это не очень удобно для использования, как есть, но есть много ресурсов IoC / DI онлайн, так что ознакомьтесь с ними.
Примечание: для веб-приложений вы захотитепроверьте обработку жизненного цикла для каждого запроса, у вас редко будут синглтоны для всего веб-приложения.