0

次のコードを実装しましたが、インターフェイスで何が起こっているのかわかりません。Project.Web と Project.Core の 2 つのプロジェクトがあります。

Project.Web には、DataSource インターフェイスを実装する Infrastructure 名前空間があります。

namespace Project.Web.Infrastructure
{
    public class ProjectDataSource : DbContext, IProjectDataSource
    {

        public ProjectDataSource() : base("DefaultConnection") // 1) What is this constructor doing?
        {

        }

        public DbSet<Set> Sets { get; set; }
        public DbSet<Card> Cards { get; set; }


        void IProjectDataSource.Save()   // 2) This method isn't even defined in the interface, what value does it provide?
        {
            SaveChanges();
        }

        IQueryable<Card> IProjectDataSource.Cards // 3) This gets me a list of Cards, but from where?
        {
            get { return Cards; }
        }

        IQueryable<Set> IProjectDataSource.Sets
        {
            get { return Sets; }
        }

    }
}

今、Project.Core には IProjectDataSource というインターフェイスがあります。

namespace Project.Core
{
    public interface IProjectDataSource
    {
        IQueryable<Card> Cards { get; }
        IQueryable<Set> Sets { get; }
        IQueryable<Side> Sides { get; }
        void Save();
    }
}

Web プロジェクト コントローラー内には、次のようなコードがあります。

namespace Project.Web.Controllers
{
    public class SetController : Controller
    {
        private readonly ProjectDataSource _db;

        public SetController(ProjectDataSource db)
        {
            _db = db;
        }

質問 1 ~ 3 はコードにあります。私の最後の質問は 4) 最後のコード ブロックで正確に何が起こっているのか? SetController のコンストラクターを使用すると、コードの結合が少なくなるのはなぜですか?

明確な例を示したポインタがあれば役立ちます.MVCアプリケーションにサービスレイヤーを実装できるように、インターフェイスを理解するのに非常に苦労していますが、少し苦労しています. 本当にありがとう。

4

2 に答える 2

0

質問2)および3)について-.Saveおよび.Cardsは、IProjectDataSource(カスタムデータアクセスインターフェイス)とDbContext(機能を利用する基本クラス)の両方で定義されます。これらは両方ともパブリックであり、同じ署名を持っています。DbContextではなくIProjectDataSourceを介してアクセスされるようにする必要があります。したがって、先行するIProjectDataSourceです。これが、インターフェースに対するプログラミングの方法です。この機能は、「ベース」実装であるDbContextから提供されます。

ジョンはすでに1と4に答えています。

于 2013-02-18T07:55:19.300 に答える
0
  1. 単一の文字列引数を取り、値 "DefaultConnection" を渡す基本クラス (DbContext) コンストラクターを呼び出すパラメーターなしのコンストラクターを提供します。(Entity Framework コードを使用しているようです。まず、これが構成ファイルの接続文字列の名前として使用されていると思います。)

  2. この質問がわかりません - Save メソッドはインターフェイスで定義されていますか?

  3. Entity Framework Code First は、規則に基づいてデータベースに "Card" という名前のテーブルをクエリするという魔法を行うと思います。

  4. そのままでは、コードの結合が少なくなることはありません。(インターフェイスの実装IProjectDataSource) ではなく (インターフェイス)を取るコンストラクターが必要になります。ProjectDataSourceコードはその具体的な実装に依存しないため、そのインターフェイスを非常に簡単に満たす別の実装に置き換えることができます。(これは、アプリケーションでNinjectなどの依存性注入ライブラリを使用して依存性を満たし、コントローラーを作成すると、より簡単に実現できます。)

于 2013-02-18T01:37:18.377 に答える