2012-06-07 3 views
1

나는 건축가로서의 의견을 갖고 싶었습니다.C#의 제공자 모델 종속성 주입 구현

나는 개발중인 포커 시스템을 가지고 있습니다. 현재 나는 다른 클래스에 의해 처리되는 많은 다른 유형의 게임을 가지고 있습니다 (당연히 공통 인터페이스로).

텍사스 홀드 엠, 오마하 하이, 오마하 하이/로우, 7- 카드 스터드, 7- 카드 ra, 런던 로우 볼 및 퀸즈 따르기가 포함됩니다. 나는 앞으로 더 많은 것을 가질 것으로 기대합니다.

현재 SQL 연결 문자열과 비슷한 공급자 모델을 사용하고 있습니다. 거래의 유형 이름은 모두 app.config 파일에 있습니다.

데이터베이스에 유형을 두어 설정 파일을 수정하지 않으려 고 생각했습니다. 그런 다음 새 게임을 개발할 때 설치 관리자는 새 DLL을 복사하고 DB에 게임 유형을 삽입하는 스크립트를 호출 할 수 있습니다.

이 유형의 종속성을 동적으로 허용하는 더 좋은 방법이 있습니까?

답변

3

아마 데이터베이스를 업데이트 할 필요없이이 작업을 수행 할 수도 있습니다. 하나의 DLL에 하나의 게임을 넣었으므로 왜 DLL의 메타 데이터에는 게임의 이름이 들어 있지 않은지 확인하십시오. 다음과 같이 수행 할 수 있습니다

[Game("Texas Hold Em")] 
public class TexasHoldEm : Game 
{ 
} 

게임 플러그인을로드 :

string pluginDirectory = 
    Path.Combine(AppDomain.CurrentDomain.BaseDirectory, 
     "Plugins"); 

var pluginAssemblies = 
    from file in new DirectoryInfo(pluginDirectory).GetFiles() 
    where file.Extension == ".dll" 
    select Assembly.LoadFile(file.FullName); 

var gameTypes = 
    from dll in pluginAssemblies 
    from type in dll.GetExportedTypes() 
    where typeof(Game).IsAssignableFrom(type) 
    where !type.IsAbstract 
    where !type.IsGenericTypeDefinition 
    select type; 

을 당신이 의존성 주입 컨테이너를 사용하는 경우 당신이 할 수있는, 예를 들어, 클래스에 속성으로 게임의 이름을 가질 수 자주 gameTypes을 컨테이너에 쉽게 등록합니다. 그러나 올바른 게임을 얻으려면 어쨌든 어떤 종류의 팩토리가 필요합니다.

public interface IGameFactory 
{ 
    IEnumerable<Game> GetGames(); 

    Game GetGame(string name); 
} 
0

저는 이것이 당신의 문제를 해결하는 매우 견고한 방법이라고 생각합니다. 데이터베이스에 클래스 이름을 저장하는 것과 관련이없는 특정 것이 있습니까?

+0

전혀 없습니다! 커뮤니티에서 무엇을 말하고 있는지보아야합니다. 고맙습니다! – NickV