2012-10-23 3 views
1

ISelector의 구체적인 구현을 반환하는 GetSelector 함수가있는 팩토리 클래스가 있습니다. 나는 ISelector를 구현하고 적절한 ISelector을 받고 싶은 설정을 기반으로 여러 클래스를 가지고있다.C#/ASP.NET MVC 4 팩토리에서 인터페이스에서 파생 된 객체 인스턴스화

public interface ISelector 
{ 
    string GetValue(string Params); 
} 

public class XmlSelector : ISelector 
{ 
    public string GetValue(string Params) 
    { 
     // open XML file and get value 
    } 
} 

public static class SelectorFactory 
{ 
    public static ISelector GetSelector() 
    { 
     return new XmlSelector(); // Needs changing to look at settings 
    } 
} 

제 질문은 설정을 저장하는 가장 좋은 방법은 무엇입니까? 나는 AppSettings 등을 사용하는 것을 알고 있지만 web.config에 문자열을 저장하고 스위치를 수행해야하는지 여부를 확신하지 못합니다. 단지 ISelector의 새 구현이 만들어지면 공장을 바꿔야 할 것입니다. 어셈블리 이름을 저장하고이를 기반으로 인스턴스화하는 방법이 있습니까?

감사합니다,

크리스

답변

0

나는 당신의 특정 프로젝트의 구조를 알고 있지만, 첫 눈에 내가 무엇을 할 것이라고하는 것은 관련 경우 개체를하지 않기 때문에 말하기 어렵다 ISelector를 사용하여 웹 응용 프로그램에서 분리 할 수 ​​있습니다, 나는이 개체를 공장과 함께 클래스 라이브러리에 넣을 것입니다. 새로운 ISelector를 구현하면 공장을 변경해야하지만, 실제 웹 응용 프로그램에서 전체 ISelector 패밀리를 분리 할 수 ​​있다면 리팩토링의 깊이는 모 놀리 식 아키텍처에 비해 최소가됩니다.

저는 개인적으로 미션 크리티컬 한 디자인 질문을 위해 AppSettings, web.config 설정 등을 피하는 경향이 있습니다. 예를 들어 web.config를 사용하면 구성 가능성을 쉽게하기 위해 아키텍처 데이터가 저장되는 응용 프로그램을 보았습니다. 문제는 컴파일 후에 web.config를 변경 (결국 그 목적입니다)하고, 클래스의 구현이 매우 특정한 값에 의존하는 경우 실수로 누군가가 실수로 수정 ​​될 때 충돌 위험이 있습니다 잘못된 값.

마찬가지로이 모든 것은 응용 프로그램 아키텍처에 따라 다르지만 내 반사점은 나중에 클래스 라이브러리로 수정 될 수있는 구성 요소를 분리하는 것입니다. 느슨한 커플 링은 친구입니다;).

+0

감사합니다. @levib 그러나 내 공장 및 관련 클래스/인터페이스는 이미 클래스 라이브러리로 추출되었습니다. XML 공급자에서 데이터베이스 공급자로 전환 할 수있는 간단한 방법이 필요합니다. 추가 ISelector의 유연성을 유지하면서 작성해야합니다. – Chris

+0

어떻게 전환해야합니까? 클라이언트가 구성 할 수있는 것이거나 코드 자체에서 수행 할 수있는 것입니까? (나는 당신이 미래 수업을 쓸 가능성을 언급하면서 후자를 가정하고있다.) –

+0

예, 코드 기반이 될 것입니다. 나는 다른 개발자를위한 코드 라이브러리를 공개하고 있지만, 필요에 따라 DB, XML 또는 기타 지속성 방법을 사용해야 할 수도 있습니다. 변경하기 쉽도록 만들고 싶습니다. (구현 여러 곳에서 참조 될 것입니다.) 모든 코드를 살펴보고 구체적인 구현을 변경하지 않아도됩니다! – Chris

0

AppSettings에서 수행하는 대신 맵핑 만 포함하는 별도의 XML 파일을 만드는 것이 더 나은 방법이라고 생각합니다.이 파일에서 매핑을 반복하고 GetSelector()에 올바른 인스턴스를 반환 할 수 있습니다.

관련 문제