- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
struct ServiceProvider1
{
ServiceProvider1(Service2& service1, Service3& service2, Service3& service3, Service4& service4, Service5& service5):
service1(service1),
service2(service2),
service3(service3),
service4(service4),
service5(service5),
{}
fun<Service1> service1;//fun - функциональный объект (operator() перегружен), хранящий ссылку на сервис, чтобы не писать кроме членов ещё и две функции - константную и не константную.
fun<Service2> service2;
fun<Service3> service3;
fun<Service4> service4;
fun<Service5> service5;
};
class Service1
{
public:
template<class ServiceProvider>
Service1(ServiceProvider serviceProvider):
service2(serviceProvider.service2()),//Ссылки на сервисы получаем.
service3(serviceProvider.service3()),
myMember1(serviceProvider),//эти мемберы сами внутри воспользуются провайдерами зависимостей
myMember2(serviceProvider),
myMember3(),
myMember4(myServiceProviderGeter<ServiceProvider>()),//Этому мембору понадобились новые зависимости, часть тех, что хранятся в ServiceProvider, а часть новых среди членов Service1.
myMember5(myServiceProviderGeter<ServiceProvider>())
myMember6(myServiceProviderGeter<ServiceProvider>())
{}
...
private:
template<class BaseServiceProvider>
struct MyServiceProvider: BaseServiceProvider
{
MyServiceProvider(BaseServiceProvider baseServiceProvider, Service6& service6, Service7& service7):
BaseServiceProvider(baseServiceProvider),
service6(service6),
service7(service7)
{}
fun<Service6> service6;
fun<Service7> service7;
};
template<class BaseServiceProvider> MyServiceProvider<BaseServiceProvider> myServiceProviderGeter(BaseServiceProvider baseServiceProvider) const
{
return MyServiceProvider<BaseServiceProvider>(baseServiceProvider, this->myMember2, this->myMember3);
}
};
...
ServiceProvider1 sp(...);
Servive1 service1(sp);
Service8 service8(sp);
Service9 service9(sp);
...