0

私は、パフォーマンスに対する要求が高いインターネット アプリケーションを使用しています。これは、優れたキャッシュ機能が成功に不可欠であることを意味します。

このソリューションは、データベース アクセス用に Entity Framework Code First を使用し、キャッシュ用に Postsharp を使用して構築されています。とりあえずモデルは以下のような感じ。

public class Article 
{
    private readonly IProducerOperator _producerOperator;
    public Article(IProducerOperator operator)
    { _producerOperator = operator; }

    public int Id { get; set; }
    ...
    public int ProducerId { get; set; }

    public Producer Producer { 
        get { return _producerOperator.GetProducer(ProducerId); }
    }
}

操作クラスは次のようになります。

public class ArticleOperations : IArticleOperations
{
    private readonly IDataContext _context;
    public ArticleOperations(IDataContext context)
    { _context = context; }

    [Cache]
    public Article GetArticle(int id)
    {
        var article = _context.Article.Find(id);
        return article;
    }
}

public class ProducerOperations : IProducerOperations
{
    private readonly IDataContext _context;
    public ProducerOperations(IDataContext context)
    { _context = context; }

    [Cache]
    public Producer GetProducer(int id)
    {
        var producer = _context.Producer.Find(id);
        return producer;
    }
}

私はビジネスオブジェクトに依存関係があるのは好きではありませんが、それに対する議論は、キャッシュからの遅延ロードを行うことです...ほとんどの場合。このソリューションは、キャッシングがプロデューサー... at に対して一度だけ行われることも意味しGetProducerます。通常、そこに依存関係があるとは考えません。オブジェクトは POCO でなければなりません。これについては、いくつかの新しいインプットが本当に必要です。代わりにどうすればいいですか?これが最善の方法ですか?

逆の解決も必要です。つまり、キャッシュされているプロデューサから、そのすべての記事を取得できるようにする必要があります。

4

1 に答える 1

0

まず、postsharp を使用したキャッシングと組み合わせて、最初にエンティティ フレームワーク コードを使用するソリューションが実際にはいくつか (1 つ?) あります。Ideablades は、実際にまさにこれを行っている Devforce コードを最初にリリースしました。この種のフレームワークは実際にすべてを解決し、エンティティ フレームワークを想定どおりに使用し、キャッシングと組み合わせて使用​​できます。

しかし、それはこの場合の解決策にはなりませんでした。関心を完全に分離することにしました。つまり、関心のあるビジネス オブジェクトにはデータのみが含まれるようになりました。操作クラスは、ビジネス オブジェクトを埋める責任を負いました。

于 2012-04-19T22:29:36.187 に答える