EntityフレームワークとNinjectでIoCを使用したいと思います。インターフェイス、ICRUDを実装するには、生成されたエンティティークラスが必要だと思います。 Entityフレームワークにインターフェースを実装させる方法を示す walkthrough があります。私は指示に従いましたが、私のEntityObjectCodeGenerator.csファイルは確かに「ICrud」を示していますが、インターフェースを実装していません。 EntityObjectCodeGenerator.ttの下にサブクラスは表示されません。エラーが出る
「BugnetMvc.Models.BugNetEntities」はインターフェースメンバー「BugnetMvc.Services.ICrud.Update()」を実装していません
[〜#〜]更新[〜#〜]
目標は、厳密に型指定されたビューと部分ビューもサポートするエンティティフレームワークを利用して、テスト可能で拡張可能なMVC-3イントラネットを作成することです。これまでのNinjectの小さなレベルの経験から、コントローラー自体のコンストラクターにビュー自体のサービス(各インターフェースで使用可能なCRUDメソッドを想定)と各部分ビューのサービスをオーバーロードする必要があると思います。
例えば。
public HomeController(HomeService homeCrudService, PartialViewService1 partialviewService)
Update2
明確にし、うまくいけば他の人を助けるために、コードは次のように実装できます。
これはエンティティを拡張する方法です
namespace BugnetMvc.Models//ensure namespace matches entity
{
public partial class Milestone : ICrud<Milestone>//Entity, note the CRUD generic. This gives us a lot of flexibility working with Ninject
{
public bool Create()
{
throw new System.NotImplementedException();
}
public List<Milestone> Read()
{
var milestones = new List<Milestone>();
var result = from a in new BugNetEntities1().Milestones
where a.MilestoneID >= 0
select new { a.Milestone1 };
milestones = result.AsEnumerable()
.Select(o => new Models.Milestone
{
Milestone1 = o.Milestone1
}).ToList();
return milestones;
}
public bool Update()
{
throw new System.NotImplementedException();
}
public bool Delete()
{
throw new System.NotImplementedException();
}
}
Mockエンティティの例:
namespace BugnetMvc.Services
{
public class MilestoneServiceMock : ICrud<MilestoneMock>
{
public MilestoneServiceMock()
{
}
public bool Create()
{
throw new System.NotImplementedException();
}
public bool Update()
{
throw new System.NotImplementedException();
}
public bool Delete()
{
throw new System.NotImplementedException();
}
List<MilestoneMock> ICrud<MilestoneMock>.Read()
{
//string[] mileStones = new string[14];
List<MilestoneMock> milestoneMocks = new List<MilestoneMock>();
milestoneMocks.Add(new MilestoneMock("New"));
milestoneMocks.Add(new MilestoneMock("Assessment"));
milestoneMocks.Add(new MilestoneMock("Pending Approval"));
milestoneMocks.Add(new MilestoneMock("Pending Start"));
milestoneMocks.Add(new MilestoneMock("Planning"));
milestoneMocks.Add(new MilestoneMock("Dev-In Process"));
milestoneMocks.Add(new MilestoneMock("Dev-Pending Approval to QA"));
milestoneMocks.Add(new MilestoneMock("Dev-Pending Move to QA"));
milestoneMocks.Add(new MilestoneMock("QA-In Process"));
milestoneMocks.Add(new MilestoneMock("QA-UAT"));
milestoneMocks.Add(new MilestoneMock("QA-Pending Approval to Prod"));
milestoneMocks.Add(new MilestoneMock("QA-Pending Move to Prod"));
milestoneMocks.Add(new MilestoneMock("On-Going"));
return milestoneMocks;
}
}
}
//Global.asax
internal class SiteModule : NinjectModule
{
public override void Load()
{
bool MOCKDB = true;
MOCKDB = false;
if (MOCKDB)
{
//Set up ninject bindings here.
Bind<ICrud<MilestoneMock>>().To<MilestoneServiceMock>();
Bind<ICrud<Application>>().To<ApplicationService>();
}
else
{
//Set up ninject bindings here.
Bind<ICrud<Milestone>>().To<Milestone>();
Bind<ICrud<Application>>().To<ApplicationService>();
}
}
}
Read(int Id)の必要性が発生する可能性があります。その場合、上記と同じ基本的なアイデアを使用する新しいインターフェイスでうまくいくはずです。 ICrudを更新して、モデルタイプをメソッドに渡すこともできます。たくさんのオプションがあります。 Jon Skeetの専門家の指導に感謝します。
おそらく生成されたエンティティークラスは部分クラスですよね?
その場合は、独自の部分クラスファイルを追加して、実装するインターフェイスを指定し、必要な実際の実装方法を提供できます。生成されるものを変更するよりもはるかに簡単だと思います。
インターフェイスの実装は、変更中にT4テンプレートに追加されます。スクリーンショットには表示されていませんが、ユーザーがT4テンプレートにIValidateインターフェースを実装する必要があることがアイテム13として示されています。実装が提供されると、生成されたクラスにもそれらの実装が含まれます。
ユーザー:生成されたクラス(.ttファイルの下)がIValidateインターフェイスを期待どおりに実装することに注意してください
すべてのエンティティから派生する基本クラス(EntityModelの外)を作成し(T4テンプレートファイルの簡単な変更)、基本クラスにインターフェイスを1回実装するのはどうですか。それは私にとって完璧に動作します。
少し前のことですが、T4テンプレートを使用してこれを行いました...この投稿を参照してください: 監査のようなEntityFrameworkトリガー