gpt4 book ai didi

asp.net-mvc - 一个 Controller 中的多个存储库并初始化数据库连接

转载 作者:行者123 更新时间:2023-12-05 01:23:07 26 4
gpt4 key购买 nike

我想使用存储库模式(我知道我可以使用工作单元模式,但我想在这里使用存储库模式)。所以在每个存储库类中我都有一个特定表的查询,例如:

public class NotesRepository : INotesRepository, IDisposable
{
private DatabaseContext context;

public NotesRepository(DatabaseContext context)
{
this.context = context;
}

public IQueryable<Notes> GetAllNotes()
{
return (from x in context.Notes
select x);
}
}

还有另一个存储库示例:

public class CommentsRepository : ICommentsRepository, IDisposable
{
private DatabaseContext context;

public CommentsRepository(DatabaseContext context)
{
this.context = context;
}

public IQueryable<Comments> GetAllComments()
{
return (from x in context.Comments
select x);
}
}

现在我想在一个 Controller 中使用这两个存储库。因此,使用存储库模式,我在 Controller 构造函数中初始化数据库连接并将其传递给每个存储库,对吗?例如:

public class HomeController : Controller
{
private INotesRepository NotesRepository;
private ICommentsRepository CommentsRepository;

public HomeController()
{
DatabaseContext db = new DatabaseContext();

this.NotesRepository = new NotesRepository(db);
this.CommentsRepository = new CommentsRepository(db);
}

// ........
}

最佳答案

我认为您至少应该更进一步,让 Controller 将存储库作为构造函数中的依赖项。这意味着您将在自定义 ControllerFactory(在 ASP.NET MVC 和 MVC2 中使用)或 DependencyResolver(在 ASP.NET MVC3 IIRC 中引入;如果移动到 IoC 容器)。 DatabaseContext 通常是在 Web 应用程序中根据 HttpRequest 创建的,以便在请求期间保持相同的 UnitOfWork。如果您使用 IoC 容器,这很容易完成,因为所有主要容器都内置了对此的支持。如果您手动执行此操作,则必须连接一些机制以在 Application.BeginRequestEndRequest 事件中创建和处理 DatabaseContext .

为简单起见,我将提供一个不使用容器且每个 Controller 有一个 DatabaseContext 实例的 ASP.NET MVC 示例。当 Controller 被“释放”时,DatabaseContext 也不会被释放。

public class HomeController : Controller
{
    private INotesRepository notesRepository;
    private ICommentsRepository commentsRepository;

    public HomeController(INotesRepository notesRepostory,
ICommentsRepository commentsRepository)
    {
        this.notesRepository = notesRepository;
        this.commentsRepository = commentsRepository;
    }
}

public class MyControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(
RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
return base.GetControllerInstance(requestContext, controllerType);

DatabaseContext db = new DatabaseContext();
//Here you should have logic to determine which
//type of controller to create
return new HomeController(new NotesRepository(db),
new CommentsRepository(db));
}
}

在 Global.asax Application.Start 事件处理程序中:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

如果您走容器路线,有很多 IoC 与 MVC 和您最喜欢的 Container 品牌的示例。

使用控制反转的优点是应用程序变得松散耦合并且更易于更改和维护。

关于asp.net-mvc - 一个 Controller 中的多个存储库并初始化数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13778142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com