まず、Jeff T の回答で提供されたソリューションが機能します。
ASP.NET MVC 4 + EF 5 プロジェクトでNinjectを機能させるために行った手順をまとめます。次の例では、特定のリポジトリパターンがSharpRepositoryを介して実装されていることに注意してください。
必要なソフトウェア
- Ninjectと「Ninject.MVC3」(「Ninject.Web.Common」もインストール) を NuGet 経由でインストールします。
- NuGetを使用して、 SharpRepository、「EF5 用の SharpRepository」、および「Ninject IOC を使用した SharpRepository」をインストールします。
リポジトリ層を定義する
DbContext 派生クラスを作成しますDomain.EfContext
。それは
「コンテキストを操作するための推奨される方法」。
Specific Repositoryのインターフェースを定義します。例:
// TODO By extending IRepository, the interface implements default Create-Read-Update-Delete (CRUD) logic.
// We can use "traits" to make the repository more "specific", e.g. via extending "ICanInsert".
// https://github.com/SharpRepository/SharpRepository/blob/master/SharpRepository.Samples/HowToUseTraits.cs
public interface IProjectRepository : IRepository<Project>
{
// TODO Add domain specific logic here.
}
特定のリポジトリを実装し、から継承するクラスを定義しますSharpRepository.Repository.ConfigurationBasedRepository<T, TKey>
。例:
public class ProductRepository : ConfigurationBasedRepository<Product, int>, IProductRepository
{
// TODO Implement domain specific logic here.
}
コンシューマー層を定義する
コントローラーを作成しますControllers.ProductController
。
public class ProductController : Controller
{
private IProductRepository Repository { get; private set; }
// TODO Will be used by the DiC.
public ProductController(IProductRepository repository)
{
this.Repository = repository;
}
}
依存性注入コンテナー (DiC) Ninject を介して依存性注入 (DI) をセットアップする
このファイルApp_Start/NinjectWebCommon.cs
は Ninject.Web.Common によって自動的に作成され、モジュールをロードしRegisterServices(IKernel kernel) : void
てクラスのメソッドにサービスを登録できますNinjectWebCommon
。この例のメソッドの完全なソース コードは次のとおりです。
private static void RegisterServices(IKernel kernel)
{
kernel.BindSharpRepository();
RepositoryDependencyResolver.SetDependencyResolver(
new NinjectDependencyResolver(kernel)
);
string connectionString = ConfigurationManager.ConnectionStrings["EfContext"].ConnectionString;
kernel.Bind<DbContext>()
.To<EfContext>()
.InRequestScope()
.WithConstructorArgument("connectionString", connectionString);
kernel.Bind<IProductRepository>().To<ProductRepository>();
}
sharpRepository
で次のセクションを定義しますWeb.config
。
<sharpRepository>
<repositories default="ef5Repository">
<repository name="ef5Repository"
connectionString="EfContext"
cachingStrategy="standardCachingStrategy"
dbContextType="Domain.EfContext, Domain"
factory="SharpRepository.Ef5Repository.Ef5ConfigRepositoryFactory, SharpRepository.Ef5Repository"
/>
</repositories>
</sharpRepository>
さらにconnectionStrings
、例を完成させるためのセクション (私は SQL Server LocalDB を使用しています)。
<connectionStrings>
<add name="EfContext" providerName="System.Data.SqlClient" connectionString="Data Source=(localdb)\v11.0;Initial Catalog=Domain;Integrated Security=True" />
</connectionStrings>
この結論が、ASP.NET MVC 4 と Entity Framework 5 および SharpRepository を一緒に起動して実行するために、他の人に役立つことを願っています!
不要な手順を 1 つ以上行った場合、または例で説明されているアーキテクチャを改善する可能性がある場合は、返信を残してください。
ところで、それを機能させるにはdbContextType
、セクションに属性を追加するrepository
必要がありました(Jeff Tの回答とは対照的です)。
編集 (2013-08-28):不要な手順を削除しました (最新バージョンの SharpRepository では必要ありません)。