Я недавно использовал инъекцию зависимостей (Unity) для достижения низкой связи между уровнями моего домена и любыми инфраструктурными проблемами.DI Организация контейнерного кода
Я закончил с много кода контейнера Unity в моем загрузчике MVC.
Небольшой фрагмент кода:
container.RegisterType<IUnitOfWork, EntityFrameworkUnitOfWork>("FirstContext", new PerResolveLifetimeManager(), new InjectionConstructor(new FirstContext()));
container.RegisterType<IUnitOfWork, EntityFrameworkUnitOfWork>("AnotherContext", new PerResolveLifetimeManager(), new InjectionConstructor(new AnotherContext()));
// User Aggregate
container.RegisterType<IEntityMapper<User, UserTable>, UserMapper>();
container.RegisterType<IUserRepository, UserRepository>(
new InjectionConstructor(
new ResolvedParameter<IUnitOfWork>("FirstContext"),
new ResolvedParameter<IEntityMapper<User, UserTable>>()
)
);
// Token Aggregate
container.RegisterType<IEntityMapper<Token, TokenTable>, TokenMapper>();
container.RegisterType<ITokenRepository, TokenRepository>(
new InjectionConstructor(
new ResolvedParameter<IUnitOfWork>("FirstContext"),
new ResolvedParameter<IEntityMapper<Token, TokenTable>>()
)
);
// Payment Aggregate
container.RegisterType<IReadOnlyEntityMapper<Payment, PaymentTable>, PaymentFactory>();
container.RegisterType<IPaymentRepository, PaymentRepository>(
new InjectionConstructor(
new ResolvedParameter<IUnitOfWork>("FirstContext"),
new ResolvedParameter<IReadOnlyEntityMapper<Payment, PaymentTable>>()
)
);
// Customer Aggregate
container.RegisterType<IReadOnlyEntityMapper<Customer, CustomerTable>, CustomerMapper>();
container.RegisterType<ICustomerRepository, CustomerRepository>(
new InjectionConstructor(
new ResolvedParameter<IUnitOfWork>("AnotherContext"),
new ResolvedParameter<IReadOnlyEntityMapper<Customer, CustomerTable>>()
)
);
// Country Aggregate
container.RegisterType<IReadOnlyEntityMapper<Country, CountryTable>, CountryMapper>();
container.RegisterType<ICountryRepository, CountryRepository>(
new InjectionConstructor(
new ResolvedParameter<IUnitOfWork>("AnotherContext"),
new ResolvedParameter<IReadOnlyEntityMapper<Country, CountryTable>>()
)
);
// Province Aggregate
container.RegisterType<IReadOnlyEntityMapper<Province, ProvinceTable>, ProvinceMapper>();
container.RegisterType<IProvinceRepository, ProvinceRepository>(
new InjectionConstructor(
new ResolvedParameter<IUnitOfWork>("AnotherContext"),
new ResolvedParameter<IReadOnlyEntityMapper<Province, ProvinceTable>>()
)
);
Есть ли лучший способ организовать это?
Я не могу найти какие-либо примеры/статьи/направление в Интернете.
Я не человек Единства. Но, конечно, есть способ их модуляции? Иногда я чувствую себя испорченным с помощью Ninject .. есть 'NinjectModule', которые вы можете создать для регистрации типов. Существует также расширение Ninject Conventions Extension .., которое устраняет необходимость индивидуально привязывать шаблонный код, подобный этому. Возможно, для Единства есть что-то подобное? –
Может быть (я тоже не человек Единства), но я не могу найти ничего. – davenewza