1

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プロジェクトでそれらにアクセスできません。ここで何かが完全に欠けているような気がします。

4

1 に答える 1

0

メソッドのオーバーロードを作成できますToDataModelX。a を渡してBoolean、下位オブジェクトの読み込みを非アクティブ化/アクティブ化します。ロールのユーザーを常にロードするのではなく、指示された場合にのみロードします。

internal static Model.User ToDataModelUser(User userToConvert)
{
    return ToDataModelUser(userToConvert, true);
}

internal static Model.User ToDataModelUser(User userToConvert, Boolean loadRoles)
{
    if (userToConvert == null)
    {
        return null;
    }

    Model.User modelUser = new Model.User()
    {
        ....
        Roles = new Collection<Role>()
    };

    if (loadRoles)
    {    
        foreach (Role role in userToConvert.Roles)
            modelUser.Roles.Add(RoleServies.ToDataModelRole(role, false));
    }

    return modelUser;
}


internal static Model.Role ToDataModelRole(Role roleToConvert)
{
    return ToDataModelRole(roleToConvert, true);
}

internal static Model.Role ToDataModelRole(Role roleToConvert, Boolean loadUsers)
{
    if (roleToConvert == null) return null;

    Model.Role role = new Model.Role()
    {
        ....
        Users = new Collection<User>()
    };

    if (loadUsers) 
    {
        foreach (User user in roleToConvert.Users)
            roleToConvert.Users.Add(UserServices.ToDataModelUser(user, false));
    }

    return role;
}
于 2012-08-20T19:41:29.420 に答える