私はここで長く詳細な記事を作成していますが、前もって多くの情報を提供する方が良いと心から信じています. さらに説明が必要な場合は、お問い合わせください。私の質問を読んでくれてありがとう。
私は、Adam Freeman と Steven Sanderson による本Pro ASP.NET MVC3 Framework (Apress、第 3 版) を使用して、第 VII 章から始まる Sports Store の例に取り組んでいます。このプロジェクトでは、Ninject を使用して DI を使用する必要があることに注意してください。これが、このウォークスルーに時間をかけたかった主な理由です。このチュートリアルのもう 1 つの印象的な貢献は、MVC 3 ソリューションを個別のプロジェクトに開発する方法を、実際の実装で行われる方法で示しているという事実です。私が今まで見た他の本。(ところで、一般的に言えば、Apressの本はそこにある最高のものだと思います。)
さて、第 7 章から第 8 章まで作業を進めました。つまり、データベースの作成とデータの取り込みに成功し、その内容を取得してリスト ビューに表示することができました。また、.css ファイルを介して機能する書式設定も取得しました。ただし、ここに問題があります。これを初めて実行するときに、作成した心配する小さなテーブル (Products) が 1 つしかないため、これは問題ありませんでした。すべてが正常に機能していました。しかし、後で説明する理由により、最初からやり直すことにしました。今回は、プロジェクトのコーディング時に新しい DB をゼロから作成するのではなく、既存の .MDF ファイルにアタッチしてデータにアクセスすることを除いて、同じチュートリアルを実行したいと考えました。これはすべて、テーブル、FK リレーションシップ、ビュー、関数、およびデータでいっぱいの複雑な DB を既に構築している実際のプロジェクトで、同様のパターンを使用するための道を開くためのものです。「実際の」プロジェクトで既存のデータベースを使用したいと言う必要はほとんどありません。すべてをゼロから再作成することは事実上不可能だからです。
では、Sports Store の例に戻りましょう。データベースから UI ビューにデータを取得できません。コンパイル時または実行時にエラー メッセージは表示されませんが、リスト ビューにデータが表示される代わりに、空白のページしか表示されません。この場合、ここには足場がないため、列見出しやペインがないという点で正しいことに注意してください。
見た限りでは必要な部品は揃っています。Ninject コントローラ ファクトリから始めましょう。
NinjectControllerFactory : DefaultControllerFactory
{
private IKernel ninjectKernel;
public NinjectControllerFactory()
{
ninjectKernel = new StandardKernel();
AddBindings();
}
protected override
IController GetControllerInstance
(RequestContext requestContext, Type controllerType)
{
return controllerType == null ? null
: (IController)ninjectKernel.Get(controllerType);
}
private void AddBindings()
{
//Had the mockup here before, which worked fine.
ninjectKernel.Bind<IProductRepository>().To<SportsStore2.Domain.Concrete.EFProductRepository>();
} ...
}
IProductRepository は次のとおりです。
namespace SportsStore2.Domain.Abstract
{
public interface IProductRepository
{
IQueryable<Product> Products { get; }
}
}
そして、EFProductRepository は次のように実装されます。
namespace SportsStore2.Domain.Concrete
{
public class EFProductRepository:IProductRepository
{
private EFDbContext context = new EFDbContext();
public IQueryable<Product> Products
{
get { return context.Products; }
}
}
}
もちろん、EFDbContext が定義されています。つまり、宣言:
namespace SportsStore2.Domain.Concrete
{
class EFDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
}
}
そして、Web.config ファイルの接続文字列。これは、少なくとも私が理解しているように、コンテキスト オブジェクトの定義を .MDF ファイル内の実際のデータベースと関連付けることになっています。
<connectionStrings>
<add name="EFDbContext"
connectionString="Data Source=Owner-PC\SQLEXPRESS;Initial Catalog = SportsStore20130205; Integrated security=SSPI"
providerName="System.Data.SqlClient" />
</connectionStrings>
最後に、ほぼ間違いなく、Product コントローラーを次のように定義しています。私が「最小」と言ったのは、問題がここにはないとほぼ確信しているからです。デバッグ モードでは、productRepository オブジェクトが読み込まれていないことがわかります。そこには、実行されるはずの、またはこの時点で実行された SQL コードがいくつかあります。しかし、repository.Products を呼び出しても何も返されません。
名前空間 SportsStore2.WebUI.Controllers { public class ProductController : Controller { プライベート IProductRepository リポジトリ;
public ProductController(IProductRepository productRepository)
{
repository = productRepository;
}
public ViewResult List()
{
return View(repository.Products);
}
public ViewResult Count()
{
int counter = repository.Products.Count();
return View(repository.Products.Count());
}
}
}
namespace SportsStore2.WebUI.Controllers
{
public class ProductController : Controller
{
private IProductRepository repository;
public ProductController(IProductRepository productRepository)
{
repository = productRepository;
}
public ViewResult List()
{
return View(repository.Products);
}
}
}