Я хочу использовать IoC с инфраструктурой Entity и Ninject. Я полагаю, мне нужны классы Generated Entity для реализации интерфейса ICRUD. Там прохождение, в котором показано, как заставить инфраструктуру Entity реализовать интерфейс. Я следил за указаниями, и мой файл EntityObjectCodeGenerator.cs действительно показывает "ICrud", но не реализует интерфейс. Я не вижу подклассы под EntityObjectCodeGenerator.tt, поскольку в статье говорится, что я должен. Я получаю сообщение об ошибке
'BugnetMvc.Models.BugNetEntities' делает не использовать интерфейс 'BugnetMvc.Services.ICrud.Update()'
ОБНОВЛЕНИЕ
Целью является создание тестовой расширяемой интрасети MVC-3 с использованием структуры сущностей, которая также поддерживает строго типизированные представления и частичные представления. С моего небольшого уровня опыта с Ninject до сих пор я считаю, что мне нужно перегрузить мой конструктор Controller сервисом для самого представления (предположим, что методы CRUD доступны для каждого интерфейса) и по одному для каждого частичного представления:
например.
public HomeController(HomeService homeCrudService, PartialViewService1 partialviewService)
Update2
Чтобы быть ясным и, надеюсь, помочь другим, код может быть реализован следующим образом:
Вот как можно расширить Entity
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 за его экспертное руководство.