구성 파일과 같은 외부 리소스의 이름과 같은 매개 변수로 일회 초기화가 필요한 특정 클래스에서 디자인 문제가 다시 발생합니다.C# 정적 생성자 디자인 문제 - 매개 변수를 지정해야합니다.
예를 들어 응용 프로그램 전반의 로깅, 구성 및 일반적인 도우미 메서드를 제공하는 corelib 프로젝트가 있습니다. 이 객체는 정적 생성자를 사용하여 자체를 초기화 할 수 있지만 자체에서 찾을 수없는 구성 파일에 액세스해야합니다.
나는 솔루션의 몇 가지를 볼 수 있지만이 둘은 아주 잘하지 않는 것 :
1) 매개 변수가있는 생성자를 사용합니다. 하지만 corelib 기능을 필요로하는 각 객체는 config 파일의 이름을 알아야하므로 응용 프로그램을 통과해야합니다. 또한 corelib을 싱글 톤으로 구현 한 경우 config 파일을 GetInstance 메서드의 매개 변수로 전달해야합니다.이 메서드는 GetInstance 메서드에서도 올바르지 않습니다.
2) 구성 파일이나 기타 외부 매개 변수를 전달하는 정적 속성 또는 메서드를 만듭니다.
나는 일종의 후자의 방법을 사용하고 생성자의 구성 파일을 통과하는 내부 클래스를 초기화하는 Load 메서드를 만들었습니다. 그런 다음이 내부 클래스는 MyCoreLib이라는 공용 속성을 통해 노출됩니다.
public static class CoreLib
{
private static MyCoreLib myCoreLib;
public static void Load(string configFile)
{
myCoreLib = new MyCoreLib(configFile);
}
public static MyCoreLib MyCoreLib
{
get { return myCoreLib; }
}
public class MyCoreLib
{
private string configFile;
public MyCoreLib(string configFile)
{
this.configFile = configFile;
}
public void DoSomething()
{
}
}
}
저는 여전히 행복하지 않습니다. 내부 클래스는 load 메소드를 호출 할 때까지 초기화되지 않으므로 MyCoreLib에 액세스 할 필요가있는 모든 위치를 고려해야합니다. 또한 누군가가 load 메소드를 다시 호출하는 것을 막을 수는 없습니다.
다른 패턴이나 아이디어는 어떻게 수행합니까?
감사합니다. csaam, 코드 캡슐화의 더 나은 예를 제공했습니다. 이러한 아이디어를 내놓을 것입니다. 저는 OOP에 대해 아직 조금 익숙합니다. 아직 내부 MyCoreLib 클래스를 숨길 수 있었지만 CoreLib 속성을 통해 객체를 노출 한 이유는 무엇입니까? –
불행히도 이것은 여전히 런타임까지 외부 리소스 파일의 위치를 알 수 없다는 사실로 내 문제를 해결하지 못합니다. 그러나이 예제를 통해 우리는 app/user 설정을 사용하여이를 클래스 프로젝트 내에 포함 시키려고 할 것입니다. –
-OFF TOPIC- 앱 설정에 대해 마음에 들지 않는 것은 설치 프로그램 프로젝트와 동기화되지 않는다는 것입니다. 따라서 WinForms 앱을 설치하면 사용자 생성 파일을 \ Users 또는 AppData 또는 사용자 정의 폴더 등 다양한 위치에 배치 할 수 있습니다. 설치 프로그램이 완료된 후이 위치를 앱으로 가져 오는 것은 상당히 어렵습니다. 이것이 내가 시작시 위치를 결정한 후 CoreLib 관리자가 CoreLib를 처리 할 수 있다고 가정하기보다는 위치를 전달하는 코드를 작성하려고하는 이유입니다. 매우 까다 롭지 만이 시나리오는 꽤 자주 발생해야합니까? –