코드에서 일부 코드 부분이 현재 소프트웨어 세션에 의존하는 구조가 있습니다. 소프트웨어 세션은 구성에 의해 종속성이 주입되는 여러 도우미 객체를 포함합니다.C#에서 컴포지션 인터페이스 단순화
한 예로 데이터 저장소에 대한 액세스 권한이있는 IRepository가 주입되었습니다. IRepository에는 IDbContext를 통해 데이터베이스에 다시 쓰는 DatabaseContext가 포함되어 있습니다.
SoftwareSession은 게이트웨이로 작동하는 데이터베이스의 모든 방법에 액세스하기위한 유일한 기본 인프라입니다. 이것은 데이터베이스에 객체를 쓰고 싶을 때 (예를 들어 WriteCar), 3 개의 인터페이스, 2 개의 함수가 작성된 객체에 위임하고 1 개의 함수가 구현되어야한다는 것을 의미합니다. 아래의 코드에서 명확하게 설명합니다. WriteCar 서명은 3 개의 인터페이스 (IRepository, ISoftwareSession, IDbContext), 복합 객체 관련 함수 및 실제 구현 장소 (IDbContext)를 단순히 호출하는 2 개의 장소 (Repository, SoftwareSession)로 동일하게 정의됩니다.
즉, 리팩토링하거나, 코드를 이동하거나, 기능을 추가하거나, 기능 서명을 변경하고자 할 때, 한 기능에 대해 항상 6 개를 변경해야합니다.
이것은 테스트 가능성을 향상시키는 최상의 환경을 제공한다고 생각하며 소프트웨어 세션이 저장소에 대한 액세스를 래핑하고 저장소가 데이터 컨텍스트에 대한 액세스를 래핑하는 최상의 방법을 따릅니다. 아직 한 번 더 쓸 수있는 방법이 있는지 계속 질문하고 있습니다. , 또는 아래의 코드에서 일부 개념에 대한 오해가 있습니까?
구조적으로 유지 관리가 쉬운이 구현 방법은 무엇입니까? 어쩌면 람다 (lambdas) 나 델리게이트 (delegate)의 영리한 방법을 사용하여 각각의 새로운 기능에 대해 작성된 코드의 양을 줄일 수 있습니까? 또는 Visual Studio, Resharper 등을 사용하는 일종의 템플릿 메커니즘에서이 코드를 쉽게 생성 할 수있는 라이브러리 (예 : 자동 완성 프로그램과 같은 DTO) 또는 도구가 있습니까?
여기에 개념이 혼란 스럽다면 알려주십시오. 제 동료 중 일부는 비슷한 견해를 가지고 있다는 것을 알고 있습니다. 그렇다면 다른 사람들의 오해를 분명히하는 것이 도움이 될 수 있습니다. 한 가지 들어
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