私は大規模なプロジェクトに取り組んでおり、その一部は既存のサーバー スタックを置き換えるものです。非常に正規化された大規模なデータベースでは、多くの複合オブジェクトを構築する必要があることは明らかでした。私のクエリの例は次のとおりです: 私の複合オブジェクト定義:
[DataContract]
public class CompositeEvent
{
Guid eventIdentity;
string accountIdentity;
string eventMessage;
DateTime eventLoggedOn;
string methodName;
string programName;
string userIdentity;
List<CompositeException> exceptions = new List<CompositeException>( );
List<CompositeParameter> methodParameters = new List<CompositeParameter>( );
List<CompositeParameter> databaseParameters = new List<CompositeParameter>( );
[DataMember]
public Guid EventIdentity
{
get { return eventIdentity; }
set { eventIdentity = value; }
}
[DataMember]
public string AccountIdentity
{
get { return accountIdentity; }
set { accountIdentity = value; }
}
[DataMember]
public string EventMessage
{
get { return eventMessage; }
set { eventMessage = value; }
}
[DataMember]
public DateTime EventLoggedOn
{
get { return eventLoggedOn; }
set { eventLoggedOn = value; }
}
[DataMember]
public string MethodName
{
get { return methodName; }
set { methodName = value; }
}
[DataMember]
public string ProgramName
{
get { return programName; }
set { programName = value; }
}
[DataMember]
public string UserIdentity
{
get { return userIdentity; }
set { userIdentity = value; }
}
public string QualifiedCreator
{
get
{
if ( String.IsNullOrEmpty( programName ) && String.IsNullOrEmpty( methodName ) )
return string.Empty;
return string.Format( "{0}:{1}", String.IsNullOrEmpty( ProgramName ) ? "{undefined}" : ProgramName, String.IsNullOrEmpty( MethodName ) ? "{undefined}" : MethodName );
}
}
[DataMember]
public int EventTypeIdentity { get; set; }
[DataMember]
public string EventTypeName { get; set; }
[DataMember]
public List<CompositeException> Exceptions
{
get { return exceptions; }
set { exceptions = value; }
}
[DataMember]
public List<CompositeParameter> MethodParameters
{
get { return methodParameters; }
set { methodParameters = value; }
}
[DataMember]
public List<CompositeParameter> DatabaseParameters
{
get { return databaseParameters; }
set { databaseParameters = value; }
}
}
そして、私のサービスでの私のデータベースクエリ:
using ( Framework.Data.FrameworkDataEntities context = new Data.FrameworkDataEntities( ) )
{
var list = from item in context.EventLogs
join typeName in context.EventLogTypes on item.EventTypeId equals typeName.Id
orderby item.EventLoggedOn, item.EventLogType
select new CompositeEvent
{
AccountIdentity = item.AccountIdentity,
EventIdentity = item.Id,
EventLoggedOn = item.EventLoggedOn,
EventMessage = item.EventMessage,
EventTypeIdentity = item.EventTypeId,
EventTypeName = typeName.EventTypeName,
MethodName = item.MethodName,
ProgramName = item.ProgramName,
UserIdentity = item.UserIdentity
};
return new List<CompositeEvent>( list );
}
これで、私の複合オブジェクトの定義から、それにはデータのみが含まれ、ビジネス ルールは含まれず、ビジネス構造、データ構造、またはその他の永続性や公開は含まれていないことが明らかです。
しかし、私のチーム メイトは、これはドメイン モデルにしか存在できず、この明確に定義されたオブジェクトから DTO にデータを移動するサイクルを費やす必要があると述べています。それだけでなく、a) すべての DTO の名前に DTO が含まれている必要があり、b) ネットワークを介して移動する目的でのみ存在する必要があります。したがって、クライアント コードを開発するときは、a) 各オブジェクト プロパティのプロパティを作成し、b) DTO からビュー モデル プロパティに移動する必要があります。
これはDTOを極限まで進めていると感じます。これは、これらがデータ転送オブジェクトである複合オブジェクトの定義に基づいています。また、このオブジェクトをクライアントに保存し、クライアントでこのオブジェクトに直接バインディングを行うことにまったく問題はありません。私がしているのは、複合オブジェクトで定義されたすべてのプロパティを取得してDTOにコピーすることだけなので、オブジェクトを作成して別のオブジェクトにコピーしてからもう一度内部にコピーするのは、時間とサイクルの膨大な無駄のようですクライアントのプロパティ。
これに関する他の意見に興味があります。私は、関心の分離や単一責任の原則などの OOP ルールに違反していないと感じています...少なくとも、これらについて極端に肛門にならない限り. ご意見????