【发布时间】:2014-05-12 12:32:09
【问题描述】:
我想将 IoC 与 Entity 框架和 Ninject 一起使用。我想我需要生成的实体类来实现一个接口 ICRUD。有一个walkthrough 展示了如何强制实体框架实现一个接口。我按照指示操作,我的 EntityObjectCodeGenerator.cs 文件确实显示“ICrud”,但没有实现接口。正如文章所说,我没有看到 EntityObjectCodeGenerator.tt 下的任何子类。我收到错误
'BugnetMvc.Models.BugNetEntities' 确实 不实现接口成员 'BugnetMvc.Services.ICrud.Update()'
更新
目标是利用实体框架创建可测试、可扩展的 MVC-3 内部网,该框架还支持强类型视图和部分视图。从我迄今为止对 Ninject 的少量经验来看,我相信我需要重载我的 Controller 的构造函数,为 View 本身提供一个服务(假设每个接口都有可用的 CRUD 方法),并为每个部分视图提供一个服务:
例如
public HomeController(HomeService homeCrudService, PartialViewService1 partialviewService)
更新2
为了清楚起见并希望对其他人有所帮助,代码可以实现如下:
这是扩展实体的方式
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 的专家指导。
【问题讨论】:
标签: c# entity-framework asp.net-mvc-3 ninject