문제

수업이 있으며 정보의 저장소는 웹 또는 Windows 응용 프로그램에서 소비되는지 여부에 따라 다릅니다. 공장 패턴을 사용하여 올바른 개체를 전달하려고했습니다. 그런 다음 발신자가 객체를 재현하고 싶지 않다면 해당 객체를 적절하게 저장한다고 생각합니다. 플랫폼을 기반으로 데이터 저장을 추상화하는 데 다른 제안이 있습니까?

예를 들어 Windows App (적절한 서브 클래스를 보내기)에서 호출 할 때 데이터를 로컬 변수로 저장하고 웹 앱에서 호출 할 때 세션을 저장하려고합니다.

도움이 되었습니까?

해결책

SGREEVE가 말했듯이, 문제의 분리는 유지 보수 가능한 코드를 얻기 위해 고려해야 할 사항입니다.

리포지토리 아이디어를 사용하여 Winform 앱과 웹 앱은 자체 스토리지 제공 업체를 주입 할 수 있습니다. 해당 제공 업체는 상속 또는 구성으로 필요한 경우 몇 가지 일반적인 논리를 공유 할 수 있습니다.

public class MyClassRepository
{
    IStorageProvider _provider;
    public MyClassRepository(IStorageProvider provider)
    {
        _provider = provider;
    }

    public void Save(MyClass o)
    {
        _provider.Save(o);
    }

    public MyClass GetBy(string id)
    {
        return _provider.GetBy(id);
    }
}

WinForms 앱은 다음을 통해 스토리지를 호출합니다.

var provider = new WindowsStorageProvider();
var rep = new MyClassRepository(provider);
rep.Save(myClassObject);

그리고 웹 앱 :

var provider = new WebStorageProvider();
var rep = new MyClassRepository(provider);
rep.Save(myClassObject);

다른 팁

공장 패턴이 당신이 가진 문제에 대한 해결책 인 것처럼 들리지 않습니다. 공장 패턴은 클래스의 특정 하위 유형의 인스턴스를 제공하여 (a) 실제 하위 유형으로부터 공장의 발신자를 보호하고 (b) 공장이 반환 할 하위 유형을 결정하는 데 사용한 논리.

이것은 여기서 필요한 것이 아닙니다. 저장된 데이터를 모델링하는 클래스에서 데이터 저장을 추상화해야한다고 생각합니다.

귀하는 두 개의 응용 프로그램에 공통점이 있으며, 각 응용 프로그램은 해당 응용 프로그램에 적합한 방식으로 클래스에서 캡슐화 한 데이터를 저장하기위한 기능을 구현해야합니다. 이것은 두 가지를 의미합니다.

  1. 각 애플리케이션 (웹 및 Windows 양식)에는 데이터를 저장하는 기능이 포함되어야하지만 다른 사람이 사용하는 코드를 포함 할 필요는 없습니다. 예를 들어 Windows Forms 앱은 웹 세션에 데이터를 저장하는 방법을 알 필요가 없습니다. 따라서 웹 세션에 데이터를 저장하는 코드는 웹 앱의 일부이지만 Windows Forms 앱의 일부는 아니지만 그 반대의 경우에 있어야합니다.

  2. 이것이 사실이라는 점을 감안할 때, 저장하는 클래스의 누가 데이터가 두 앱에 공통적이어야한다는 점을 감안할 때, 그 스토리지 로직은 해당 클래스의 일부가 될 수 없습니다. (허용 된 OO 디자인 원칙에 따라, 그 클래스는 미래의 변화를 어렵게 만드는 종속성을 소개하기 때문에 어쨌든 응용 프로그램의 다른 부분에 스스로를 저장하는 방법을 알지 못해야합니다. 단일 책임 원칙...)

이것이 도움이되기를 바랍니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top