【发布时间】:2009-12-28 13:37:17
【问题描述】:
我有一个简单的类,旨在成为一个简单的 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 中吗?
【问题讨论】:
标签: .net architecture ninject