В коде, над которым я работаю, у меня есть структура, где некоторые части кода зависят от текущего сеанса программного обеспечения. Сеанс программного обеспечения содержит несколько вспомогательных объектов, которые являются зависимыми, введенными композицией.Упрощение композиционных интерфейсов в C#
Одним из примеров является ввод в него IRepository, который содержит доступ к репозиторию данных. И IRepository содержит DatabaseContext, который записывает в базу данных через повторно IDbContext, который вводится.
SoftwareSession - единственная внедренная общая инфраструктура для доступа к базе данных, действующей в качестве шлюза. Это означает, что когда я хочу написать объект в базу данных, например WriteCar, мне нужно будет реализовать 3 интерфейса, 2 функции делегирования составленным объектам и 1 функцию с реализацией. Это поясняется в фрагменте кода ниже. Подписи WriteCar определяются одинаково в трех интерфейсах (IRepository, ISoftwareSession, IDbContext), 2 места, где он не реализован (репозиторий, SoftwareSession), который просто вызывает связанные функции связанных объектов и 1 место фактической реализации (IDbContext)
Это означает, что когда я хочу реорганизовать, переместить код, добавить функциональность или изменить подписи функций, мне всегда придется менять 6 мест для одной функции.
Я думаю, что это обеспечивает наилучшую среду для улучшения тестируемости, и она следует лучшим практикам, когда сеанс программного обеспечения обертывает доступ к репозиторию и репозиторию, обертывает доступ к контекстам данных, - но я все еще сомневаюсь, если мы сможем немного улучшить его запись , или у меня есть непонимание какой-либо концепции в коде ниже?
Что представляет собой архитектурно более удобный способ реализации этого? Может быть, даже используя какой-то умный способ лямбда или делегатов уменьшить количество кода, написанного для каждой новой функции? Или даже некоторые библиотеки (например, automapper упрощают DTO) или инструменты для облегчения генерации этого кода из какого-то механизма шаблонов с помощью Visual Studio, Resharper и т. Д.?
Пожалуйста, дайте мне знать, если у меня возникла некоторая путаница понятий здесь. Я знаю, что у некоторых моих коллег есть подобные взгляды, и в этом случае может быть полезно прояснить недоразумения и других.
public class SoftwareSession : ISoftwareSession
{
...
IRepository repository;
public void WriteCar(Car car){
repository.WriteCar(car);
}
...
}
public interface ISoftwareSession{
...
void WriteCar(Car car);
...
}
public class Repository : IRepository{
...
IDbContext context;
public void WriteCar(Car car){
context.WriteCar(car);
}
...
}
public interface IRepository{
...
void WriteCar(Car car);
...
}
public class MyDbContext : IDbContext{
...
public void WriteCar(Car car){
//The Actual Implementation here.
...
}
...
}
public interface IDbContext{
...
void WriteCar(Car car);
...
}
Интерфейсы может наследовать тоже! Почему бы не использовать интерфейс ICarWriter, а затем «IRepository: ICarWriter», «ISoftwareSession: ICarWriter» и т. Д. –
Я считаю, что проблема заключается в реализации вашей сессии программного обеспечения, это нарушает единую ответственность, поскольку она появляется в вашей структуре, что что-либо происходит с базой данных, writeCar, writeCustomer и т. Д. Должно быть, в этом классе есть acccessor. – Dys1
@ BarryO'Kane Я согласен - это способ рефакторинга интерфейсов - и имеет смысл от уменьшения перспективы дублирования кода. Я готов ждать других возможных способов упрощения этого. – user3141326