web-dev-qa-db-ja.com

基幹業務アプリケーション(LOB)のソリューション/プロジェクト構造とクラスの整理

質問 how-do-you-organize-your-projects にはすでにいくつかの良い答えがあります。 この推奨構造 について理解を深めたい:

_MyApp.Core
MyApp.Model
MyApp.Presenter
MyApp.Persistence
MyApp.UI
MyApp.Validation
MyApp.Report
MyApp.Web
_

MyAppがwinformsのリッチクライアントであると仮定 学生、コース、部屋、教師を管理するため

コース情報を編集するためのwinformsユーザーコントロールがあるとします(コースの名前、担当者、どの部屋でどの学生がコースに登録したか)。以下のクラスは、ユーザーコントロールに必要なすべての情報を反映しています

_public class CourseDetails{
    public int Id{ get; set;}
    public Course Course{ get; set;}
    public Teacher Teacher{get; set;}
    public Room Room{get; set;}
    public List<Student> StudentList{get; set;}
}
_

このクラスはどこに置きますか?

MyApp.Modelのメソッド

名前空間_MyApp.Model_内のクラスがどれほど複雑か単純か知りたいのですが。

プロジェクト_MyApp.Model_に、次のような非常に単純なクラスのみが含まれている場合

_public class Course{
    public int CourseId{ get; set;}
    public string CourseName{ get; set;}
    public int CategoryId {get; private set;}

}
public class Teacher{
    public int TeacherId{ get; set;}
    public string TeacherName{ get; set;}
}
_

または_MyApp.Model_も含む必要があります

  • CourseDetailsのような複雑なクラス
  • Save()またはGetById()などの各クラスの追加メソッド

追加のトピック

どこで(どのプロジェクトで)インターフェースを実装し、どこで基本クラスを使用すべきか。

この追加のメソッド(Save()GetById())は、いつ基本クラスから継承するか、またはクラスに含める必要があります。これにより、保存および選択するためのすべてのメソッドを備えたインターフェースが提供されます。

_public class CourseDetails: ModelBase{
    ...
}

public class ModelBase{
    public bool Save() {
        Console.WriteLine("do something clever to save each entity");
        return true;
    }
}
_

もっと明確になっていないのは申し訳ありません。どのプロジェクトにどのような種類(クラス、インターフェース、リソースなど)を配置する必要があるのか​​、またその理由を知りたいのですが。私はあなたがアイデアを得ることを望みます。

ここで概説している構造は、オニオンアーキテクチャと呼ばれ、ポートとアダプタまたは六角形アーキテクチャとも呼ばれます。

原則は、アプリケーションコアがあり、UIレイヤー、永続化レイヤー、サービスレイヤーなど、このコアの外側のレイヤーを配置できることです。

コアでアプリケーションのインターフェイスを定義し、外側の層にそれらを実装させます。このようにして、コアは「純粋」のままであり、たとえば永続化メカニズムをMySQLからMongoDBに変更したい場合は、MongoDBに固有の別のモジュールで、コアで定義された永続化インターフェースを再実装するだけです。

参照: http://alistair.cockburn.us/Hexagonal+architecture および http://jeffreypalermo.com/blog/the-onion-architecture-part-1/

詳細については、.

2
hkon

場合によります

もちろん、これに対する答えはいくつかの要因に依存します:

  • プロジェクトのバイナリのいずれかがアプリケーション間で共有されますか?
  • プロジェクトバイナリのいずれかをプラグインできますか?
  • アプリケーションには複数の層がありますか?

アプリケーションがスタンドアロンの場合、非常にシンプルで簡単な配置モデルxcopyが提供されるため、単一の自己完結型exeを使用するのが最善のオプションです。この場合、ファイルの編成は、単一のプロジェクト内のフォルダーを介して行われます。

これは、Web部分がクラス管理データ用の個別のデータストアとインターフェースすることを意図したクライアントコードで構成されていると想定して、アプリケーションの説明と一致しています。

多層アプリケーションでは、層ごとに1つ以上のバイナリと、層間で共有されるすべてのタイプのバイナリが必要になる場合があります。

ただし、一般的には、必要がない限りプロジェクトを分割することはありません-YAGNI。

1
Dan Lyons