我有一个简单的类,旨在成为一个简单的 POCO——它只保存数据。除了一个例外:它包含一组笔记。我想延迟加载这个集合,这样我就不必在不需要它们的页面上获取注释。存根是这样的:
public class MyDTOClass
{
private ICollection<Note> _notes = null;
public ICollection<Note> Notes
{
get
{
if(_notes == null)
{
// Get an INoteRepository and initialize the collection
}
return _notes;
}
}
}
现在,我想知道如何从这里开始。这是一个 ASP.net MVC 应用程序,我使用依赖注入将 IRepositories 注入需要它们的类中,例如我的控制器。但由于这里的这个类应该是一个非常简单的 DTO,我不愿意将 INoteRepository 注入其中,也是因为调用者不应该担心或关心这是延迟加载的事实。
因此,我正在考虑在我的模型中拥有另一个包含 INoteRepository 的类。
public class MyDataAccessClass
{
private INoteRepository _noteRepo;
// Inject is part of Ninject and makes sure I pass the correct
// INoteRepository automatically
[Inject]
public MyDataAccessClass(INoteRepository noteRepository)
{
_noteRepo = noteRepository;
}
public IEnumerable<Note> GetNotes(int projectId)
{
return _noteRepo.GetNotes(projectId);
}
}
这当然可以,但我想知道这是否是正确的架构?我将简单的 DTOClass 耦合到另一个数据访问类,也可能耦合到我的 DI 机制(因为我需要在 Notes 的 getter 中创建数据访问类的实例)。
你会做不同的事情吗?有没有更好的方法来做到这一点,还要记住我已经使用了 Ninject?
我猜这不再是 POCO 或 DTO,因为它现在包含逻辑,但没关系。我希望它对外部调用者看起来像 POCO,所以我喜欢在这个或其他类上有一个属性“Notes”而不是像“GetNotesForProject”这样的方法。
我当前的解决方案真的很难看,因为我需要从我的 MvcApplication 获取 Ninject Kernel 并使用它来启动 ProjectDataProvider 类,该类在其构造函数中采用 INoteRepository,以避免将 INoteRepository 放在我的“DTO”类中的某个位置:
public ICollection<Note> Notes
{
get
{
if(_notes == null)
{
var app = HttpContext.Current.ApplicationInstance as MvcApplication;
if (app == null)
throw new InvalidOperationException("Application couldn't be found");
var pdp = app.Kernel.Get<ProjectDataProvider>();
_notes = new List<Note>(pdp.GetNotes(Id));
}
return _notes;
}
}
编辑:打开赏金。让我们忽略“POCO”和“DTO”的术语,我会相应地重构。所以这是关于:在这种情况下延迟加载代码应该如何看待,我可以/应该避免将 INoteRepository 传递到 MyDTOClass 吗?