ProjectSilkの構造に従って中規模のプロジェクトを作成しました。ただし、リポジトリから取得したエンティティをWebプロジェクトで使用するドメインモデルオブジェクトにマッピングするのに問題があります。私はここにすべてのコードで同様の質問を投稿しましたが、私が探している助けを受け取っていません。
私のアプリケーションのアーキテクチャは、ProjectSilkのアーキテクチャに非常に厳密に従っています。データ層は、リポジトリとモデルPOCOを保持します。ビジネスロジック層はサービスを保持します。これらのサービス内で、オブジェクトをデータ層からビジネスレイヤーのモデルオブジェクトにマップします。
internal static Model.User ToDataModelUser(User userToConvert)
{
if (userToConvert == null)
{
return null;
}
Model.User modelUser = new Model.User()
{
UserId = userToConvert.UserId,
AuthorizationId = userToConvert.AuthorizationId,
DisplayName = userToConvert.DisplayName,
Country = userToConvert.Country,
PostalCode = userToConvert.PostalCode,
HasRegistered = userToConvert.HasRegistered,
};
return modelUser;
}
internal static User ToServiceUser(Model.User dataUser)
{
if (dataUser == null)
{
return null;
}
User user = new User()
{
UserId = dataUser.UserId,
AuthorizationId = dataUser.AuthorizationId,
DisplayName = dataUser.DisplayName,
Country = dataUser.Country,
PostalCode = dataUser.PostalCode,
HasRegistered = dataUser.HasRegistered,
};
return user;
}
私の質問は、多対多の関係がある場合、このようなオブジェクトをどのようにマップするのですか?たとえば、ユーザーがICollectionロールを持っているとします。つまり、私のロールにはICollectionユーザーがいます。ToDataModelUserまたはToServiceUserを介してユーザーをマッピングしているときに、入力するRolesプロパティがあります。したがって、上記のコードは次のようになります。
internal static Model.User ToDataModelUser(User userToConvert)
{
if (userToConvert == null)
{
return null;
}
Model.User modelUser = new Model.User()
{
UserId = userToConvert.UserId,
AuthorizationId = userToConvert.AuthorizationId,
DisplayName = userToConvert.DisplayName,
Country = userToConvert.Country,
PostalCode = userToConvert.PostalCode,
HasRegistered = userToConvert.HasRegistered,
Roles = new Collection<Role>()
};
foreach (Role role in userToConvert.Roles)
modelUser.Roles.Add(RoleServies.ToDataModelRole(role));
return modelUser;
}
Now here comes the problem, if you look at RoleServices.ToDataModelRole(Role role) this is what you get:
internal static Model.Role ToDataModelRole(Role roleToConvert)
{
if (roleToConvert == null) return null;
Model.Role role = new Model.Role()
{
Description = roleToConvert.Description,
RoleId = roleToConvert.RoleId,
RoleName = roleToConvert.RoleName,
Users = new Collection<User>()
};
foreach (User user in roleToConvert.Users)
roleToConvert.Users.Add(UserServices.ToDataModelUser(user));
return role;
}
簡単にわかるように、これを実行すると、スタックオーバーフローエラーが発生します。マッピングを実行しようとすると、ユーザー>>ロール>>ユーザー>>ロール>>などから発生します。ナビゲーションプロパティをマップしないと、Webプロジェクトでそれらにアクセスできません。ここで何かが完全に欠けているような気がします。