現在、ASP.NET MVCプロジェクトではonion arcitectureを使用するようにリファクタリングしています。今後の開発ニーズに適しているようです。タマネギのアーキテクチャでのビューモデル/ DTOの配置
私は私が使用する必要があると思うレイヤを設定していると私の解決策は、次のようになります:だから
、基本的に私は理解してきたように、ClientName.Core
プロジェクトはいずれも持つべきではありません他のプロジェクトへの参照はまったくありません。 ClientName.Infrastructure
にはClientName.Core
への参照が必要です。 ClientName.Core
のInterfacesフォルダはClientName.Infrastructure
プロジェクトにあるサービスを定義し、DbContextとドメインエンティティは分離されているため、エンティティのみがコアプロジェクトに含まれます。
私が壁に向かって頭を動かしたところでは、ClientName.Infrastructure
プロジェクトはドメインエンティティをそれを呼び出すクライアントに返してはいけないということでした。これは、コアプロジェクトとタマネギの原則に違反するUIとの間の参照を作成します。これを回避する方法は、私が読んだとおり、代わりにインフラストラクチャサービスがDTOを返すようにすることです。しかし、PersonService
クラスから返されたPersonDto
の場合、PersonDto
オブジェクトは、ClientName.Core
プロジェクトがそれを認識する必要があります。
質問:UI /クライアントに使用されるDTO/ViewModel /その他のモデルは、どこに配置すればよいですか?これらのモデルを保持する別のクラスライブラリを作成し、UI、インフラストラクチャ、およびコアプロジェクトの両方で参照できるようにしますか?私は事前にこの;-)
おかげについて少し困惑しているよう
すべてのヘルプ/ヒント
が大幅に高く評価されます。 Euphoricsの回答に基づいてEDIT
、私はいくつかのフォローアップの質問を右、多分それを得た場合だけチェックするために、ここで例のコードを書いています。
だから基本的に、私のClientName.Core
層に、私はつまり、ビジネスロジックが含まれている私のエンティティを持っているPerson
とFirm
エンティティは次のようになります。
(Exists in ClientName.Core/Entities)
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public Firm Firm { get; set; }
}
(Exists in ClientName.Core/Entities)
Public class Firm
{
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<Person> Employees { get; set; }
public IEnumerable<Person> GetEmployeesByName(string name)
{
return Employees.Where(x => x.Name.Equals(name));
}
public void AddEmployee(Person employee)
{
Employees.Add(employee);
}
public void CreateFirm(Firm firm)
{
// what should happen here? Using entity framework, I have no reference to the DbContext here...
}
}
(Exists in ClientName.Infrastructure/Services)
public class FirmService : IFirmService
{
private readonly IDbContext _context;
public FirmService(IDbContext context)
{
_context = context;
}
public Firm GetById(int firmId)
{
return _context.Firms.Find(firmId);
}
// So basically, this should not call any domain business logic?
public void CreateFirm(CreateFirmFormViewModel formViewModel)
{
Firm firm = new Firm()
{
Name = formViewModel.Name;
}
_context.Firms.Add(firm);
_context.SaveChanges();
}
public IEnumerable<Person> GetEmployeesByName(int firmId, string name)
{
Firm firm = _context.Firms.Find(firmId);
return firm.GetEmployeesByName(name);
}
}
は私がすべての読み取りクエリがなければならないことを修正アムエンティティに直接定義されています(Entity Frameworkを使用しているのでエンティティの拡張として)、作成/更新/削除はインフラストラクチャ層のサービスでのみ行われますか?
FirmService
インターフェイス/クラスに読み取り(つまり、IEnumerable<Person> GetEmployeesByName(int firmId, string name)
メソッド)する必要がありますか?
おかげで再び
こんにちは@ユーフォリック、あなたの答えをありがとう。私はちょうど私が正しいことを確認するために、いくつかの簡単なコードといくつかのフォローアップの質問で私の質問を更新しました。 –