P.B*_*key 31 c# entity-framework ninject asp.net-mvc-3
我想将IoC与Entity框架和Ninject一起使用.我想我需要Generated Entity类来实现一个接口ICRUD.这是一个演练,展示了如何强制实体框架实现一个接口.我按照指示操作,我的EntityObjectCodeGenerator.cs文件确实显示"ICrud",但没有实现接口.我没有在EntityObjectCodeGenerator.tt下看到任何子类,因为文章说我应该这样做.我收到错误
'BugnetMvc.Models.BugNetEntities'没有实现接口成员'BugnetMvc.Services.ICrud.Update()'
更新
目标是利用实体框架创建可测试的,可扩展的MVC-3内部网,该框架还支持强类型视图和部分视图.根据我迄今为止对Ninject的小经验,我相信我需要使用View本身的服务(假设每个接口可用的CRUD方法)重载我的Controller的构造函数,并为每个局部视图添加一个:
例如
public HomeController(HomeService homeCrudService, PartialViewService1 partialviewService)
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
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>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
可能会出现对Read(int Id)的需求,在这种情况下,使用上述相同基本思想的新界面应该可以解决问题.甚至可以更新ICrud以将模型类型传递给方法.有很多选择.这对我有用,感谢Jon Skeet的专家指导.
Jon*_*eet 57
据推测,生成的实体类是部分类,对吗?
如果是这样,您可以添加自己的部分类文件来指定要实现的接口 - 并提供您需要的任何实际实现方法.我怀疑这比改变生成的内容要简单得多.
接口实现将在修改时添加到T4模板.它没有在屏幕截图中显示,但是作为项目13提到用户必须在T4模板中实现IValidate接口.一旦提供了实现,生成的类也将具有这些实现.
用户:注意生成的类(在.tt文件下)按预期实现IValidate接口
归档时间: |
|
查看次数: |
20879 次 |
最近记录: |