1

意見を聞きたかった建築の状況があります。

私は自分が開発しているポーカーシステムを持っています。現在、私は現在、さまざまなクラスで処理されているさまざまな種類のゲームを持っています(もちろん、共通のインターフェイスを備えています)。

ゲームには、テキサスホールデム、オマハハイ、オマハハイ/ロー、7カードスタッド、7カードラズ、ロンドンローボール、フォローザクイーンが含まれます。将来的にはもっと増えると思います。

現在、SQL接続文字列と同様のプロバイダーモデルを使用しています。ゲームのすべてのタイプ名はapp.configファイルにあります。

設定ファイルに触れる必要がないように、データベースに型を配置することを考えていました。次に、新しいゲームを開発するときに、インストーラーは新しいDLLをコピーするだけで、ゲームのタイプをDBに挿入するスクリプトを呼び出すことができます。

このタイプの依存関係を動的に許可するためのより良い方法はありますか?

4

2 に答える 2

3

おそらく、データベースを更新しなくてもこれを行うことができます。1 つのゲームを 1 つの 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);
}
于 2012-06-07T20:33:27.623 に答える
0

これはあなたの問題を解決するための非常に堅実な方法だと思います。データベースにクラス名を保存することについて、特に気に入らない点はありますか?

于 2012-06-07T18:30:09.873 に答える