1
  • locationsそれぞれが独自のリストを持っているさまざまなものがありますProducts
  • それぞれProductがに属しSubCategoryます。
  • それぞれSubCategoryがに属しCategoryます。

Categoriesが与えられたときにリストを表示する必要がLocationあるため、その場所の製品に関連付けられる可能性のあるカテゴリのリストを抽出できるViewModelが必要です。

私はこのようなことをしたいと思っています(私のViewModel):

public class LocationSummaryViewModel
{
    public Location Location { get; set; }

    private ICollection<Category> categories;

    public ICollection<Category> Categories
    {
        get
        {
            if ( Establishment != null )
            {
                foreach (var item in Location.Products)
                {
                    categories.Add(item.SubCategory.Category);
                }
                return categories;
            }
            else
            {
                Categories.Add(new Category { Name = "Default Category" });
                return categories;
            }
        }
    }
}

categoriesただし、インスタンス化されることはないため、これは構文的には機能しません。また、これだけのロジックをViewModelに配置する必要があるかどうかもわかりません。

ViewModel内のロケーションに含まれる製品のリストからカテゴリ情報を描画するロジックを配置することで、正しい方向に進んでいますか?それとも私はこれを非常に珍しい方法で行っていますか?

これをまったく奇妙な方法で行っている場合、Locationエンティティに含まれる製品のリストからカテゴリ情報を取得するためのより良い方法は何ですか?


参考までに、私のロケーションモデル:

public class Location
{
    public int LocationId { get; set; }

    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }  
}

私の製品モデル:

public class Product
{
    public int ProductId { get; set; }

    public string Name { get; set; }

    public int CategoryId { get; set; }

    public virtual SubCategory SubCategory { get; set; }

    public int LocationId { get; set; }

    public virtual Location Location { get; set; }
}

と私のサブカテゴリモデル:

public class SubCategory
{
    public int SubCategoryId { get; set; }

    public string Name { get; set; }

    public int CategoryId { get; set; }

    public virtual Category Category { get; set; }
}

更新:私は以下に自分の質問に対する潜在的な回答を投稿しました-より良い回答/提案を歓迎します

4

2 に答える 2

1

ビジネスロジックはビューモデルではなく、ドメインモデルである必要があります。ビジネスロジックをロケーションなどのドメインモデルに移動してみませんか。そうでない場合は、貧血モデルのアンチパターンに違反しています

ビューモデルには、ビューのみをサポートするロジックが含まれている必要があります。

施設がどこから来たのかは実際にはわかりませんが、Locationクラスは次のようになります。

public class Location
{
    public int EstablishmentId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Product> Products { get; set; }

    public Category GetCategories()
    {
        foreach (var item in Location.Products)
        {
            categories.Add(item.SubCategory.Category);
        }
        return categories;
    }
}
于 2012-08-03T14:56:53.537 に答える
0

ViewModelを次のように変更した場合:

public class LocationSummaryViewModel
{
    public Location Location { get; set; }

    public  ICollection<Category> Categories { get; set; }
}

ロジックをコントローラーに移動します。

public PartialViewResult _LocationSummary(int id)
{
    Location location = _locationRepository.Locations.FirstOrDefault(p => p.LocationId == id);
    if (location != null)
    {
        var Categories = location.Products.Select(item => item.SubCategory.Category).Distinct().ToList();

        var model = new LocationSummaryViewModel
            {
                Location = location,
                Categories = Categories
            };
        return PartialView(model);
. . .

適切な結果が得られたようです(複数の同一のものを取り除くためにいくつかの調整が必要ですCategoriesが、コントローラー内のロジックを取り除く方法を見つけたいと思っていました。

これは、動作するために大量の遅延読み込みが必要になるため、問題を引き起こす可能性があります。。。現時点ではわかりません。

于 2012-08-03T14:52:17.330 に答える