3

타사 오픈 소스 응용 프로그램 (NopCommerce)의 정적 리포지토리에서 반환되는 내용을 수정해야하는 상황에 처해 있습니다. 문제는 정적 저장소를 사용하기 때문에 인터페이스와 DI를 그대로 상속받을 수 없다는 것입니다. NopCommerce 코드베이스를 수정하지 않고이 작업을 수행하려고합니다. 새로운 아이디어가 있습니까?정적 저장소 ... DI를 사용할 수 없습니다. 어떻게해야합니까?

편집 : NopCommerce가 내 코드 대신 내 repos를 사용하도록하고 싶습니다.

+0

래퍼 클래스를 사용하여 캡슐화 하시겠습니까? – Tahbaza

+0

그런 다음 래퍼 클래스를 대신 사용하도록 NopCommerce 코드를 수정해야합니까? –

+0

@ jbarker7 : 아니요, 그렇지 않습니다. Anna Lear와 Goblin (다른 용어 사용)은 변경할 수없는 통계를 중심으로 자신 만의 래퍼 클래스 라이브러리를 만들 것을 제안합니다. 두 가지 대답 중 하나를 올바르게 선택해야합니다. – Tahbaza

답변

3

우리는 현재 정말로 마감 기한을 지키고 있으며,이 문제는 결코 목적이 아닙니다. 그래서 나는 다음과 같이 가난한 사람의 정적 인 인터페이스/가난한 사람의 DI로 시작하는 것을 생각하고 있습니다. 그래서 전체 솔루션을 수정할 필요가 없습니다.

// Poor-man's static interface (DI). 
public static class OriginalBuiltInStaticClass { 
    private static IMyNewClass _myNewClass; 

    public static void Inject(IMyNewClass myNewClass) { 
     _myNewClass = myNewClass; 
     A = _myNewClass.A; 
     B = _myNewClass.B; 
     C = _myNewClass.C; 
    } 

    public static Action A = CopySimpleRenameBuiltInStaticClass.A; 
    public static Func<int, string> B = CopySimpleRenameBuiltInStaticClass.B; 
    public static Action C = CopySimpleRenameBuiltInStaticClass.C; 
} 

// Original vendor class which was copied and renamed. 
public static class CopySimpleRenameBuiltInStaticClass { 
    public static void A() { 
     Console.WriteLine("OriginalBuiltInStaticClass.A()"); 
    } 

    public static string B(int id) { 
     Console.WriteLine("OriginalBuiltInStaticClass.B()"); 
     return id.ToString(); 
    } 

    public static void C() { 
     Console.WriteLine("OriginalBuiltInStaticClass.C()"); 
    } 
} 

// Creating an interface to merge into trunk of NopCommerce (convert static repositories) 
public interface IMyNewClass { 
    void A(); 
    string B(int id); 
    void C(); 
} 

// Implementation of interface. 
public class MyNewClass : IMyNewClass { 
    public void A() { 
     Console.WriteLine("MyNewClass.A()"); 
    } 

    public string B(int id) { 
     Console.WriteLine("MyNewClass.B()"); 
     return id.ToString(); 
    } 

    public void C() { 
     CopySimpleRenameBuiltInStaticClass.C(); 
    } 

} 

어떤 생각을 : 그럼 나중에, 우리는 시간이 그리 누를 때, 인터페이스 및 의존성 주입을 사용하고 NopCommerce에 패치 제출을 통해 변경?

+0

이것은 완벽하게 작동했습니다 ... T4 템플릿을 만들고 자동으로 인터페이스, 래퍼 및 구현 클래스를 생성했습니다. 자, 그냥 장소 : NopRepo.Inject (new MyExtClass.MyNopRepo()); 은 Application_Start의 Global.asax에, 비올라는 ... 정적 클래스의 DI입니다. –

+0

T4 템플릿과이 코드의 업데이트에 관심이있는 사용자 : http://joshbarker.net/?p=33 –

3

자신의 인터페이스와 NopCommerce에 위임 한 클래스 구현을 만들어서 자신의 물건을 추상화 할 수 있습니다. 그런 다음 코드가 NopCommerce 클래스에 직접 액세스하는 대신 인터페이스를 사용하도록하십시오. 결과가 응용 프로그램에 반환되기 전에 클래스 내의 NopCommerce 출력을 수정할 수 있습니다.

보너스를 추가하면 인터페이스를 모방 해 본격적인 저장소 구현이 필요없는 몇 가지 테스트를 수행 할 수 있습니다. 코드에서이 같은

뭔가 :

public interface IRepository 
{ 
    MyItem GetItem(int id); 
} 

public class MyNopCommerceWrapper : IRepository 
{ 
    public MyItem GetItem(int id) 
    { 
     // I have no idea what NopCommerce API looks like, so I made this up. 
     var myItem = NopCommerce.GetItem(id); 

     ModifyMyItem(myItem); 

     return myItem; 
    } 
} 
+0

나는 네가 여기서 말하는 것을 두뇌로 감싸려고 노력하고있는 것 같아. 기본적으로 NopCommerce가 작동하는 방식과 NopCommerce에 반환되는 방식을 수정해야합니다. 다른 응용 프로그램은 없습니다. DI를 내 자신으로 만들 수있는 것처럼 리포지토리를 수정하거나 가상으로 표시되어있는 것처럼 저장소를 수정하면됩니다. –

+0

작동하는 것처럼 보이지만 정적 저장소 대신이 랩퍼를 사용하도록 NopCommerce를 수정해야합니다. –

+0

아니요. 애플리케이션이 NopCommerce 라이브러리에 대해 알지 못합니다. 랩퍼 클래스로 랩핑되며 응용 프로그램은 랩퍼의 메소드 만 호출합니다. 래퍼 만 NopCommerce에 종속됩니다. 응용 프로그램에서 래퍼를 주입하여 DI를 사용할 수 있습니다. NopCommerce 코드 기반을 수정할 이유가 없습니다. 래퍼에 대해 알 필요가 없습니다. –

관련 문제