gpt4 book ai didi

asp.net-mvc - 有人可以解释一下 CaSTLe Windsor 在我的应用程序中是如何工作的吗?

转载 作者:行者123 更新时间:2023-12-02 18:08:21 25 4
gpt4 key购买 nike

我已经开始使用温莎城堡,不知怎的,我的应用程序已经全部启动并运行,但我不太明白它是如何工作的。不要让我引用文档,否则我就不会在这里。

在我的 Global.asax.cs 中,我有这个:

private static IWindsorContainer container;

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
BootstrapContainer();
}

protected void Application_End()
{
container.Dispose();
}

private static void BootstrapContainer()
{
container = new WindsorContainer()
.Install(FromAssembly.This());

var controllerFactory = new WindsorControllerFactory(container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
}

现在这是注册一个我理解的新 Controller 工厂。我认为从当前程序集安装 WindsorContainer 会注册所有安装程序,例如我有一个存储库安装程序。我假设在 Global.asax 中创建的容器已传递给安装程序。

public class RepositoriesInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{

container.Register(AllTypes.FromThisAssembly()
.Where(type => type.Name.EndsWith("Repository"))
.WithService.DefaultInterface()
.Configure(c => c.LifeStyle.PerWebRequest));
}
}

在我的 Controller 中,我创建了一个构造函数并传入了 IRepository 参数。我不明白的是 Controller 如何接受这个参数。

其次,作为测试,我创建了 2 个实现 IRepository 的存储库类。在 Controller 构造函数中放置一个断点,它会传入这些类之一。如何映射应将实现 IRepository 的类传递给构造函数?

我还启动并运行了 Fluent NHibernate。对于下一阶段,我希望 IRepository 依赖于 ISession。我该怎么做?

感谢您的帮助

最佳答案

由于您已经注册了使用 Windsor 的 Controller 工厂,因此 Windsor IoC 容器负责在需要时解析所有 Controller 实例。

也就是说,当您访问 MVC 项目中指向“HomeController”上的操作“Index”的 URL 时,MVC 框架将向您的 WindsorControllerFactory 询问 HomeController 的实例。

如果该 Controller 有一个接受 IRepository 实例的构造函数,并且您已将 IRepository 注册为容器的服务,那么 Windsor 将知道如何满足 HomeController 类的依赖关系。因此,它可以首先将 IRepository 解析为某个具体类,实例化它,并将其作为参数传递给 HomeController 构造函数,然后将 HomeController 实例返回到 MVC 框架。

如果您需要 IRepository 的不同实现用于不同的目的(即 UserRepository 和 ProductRepository),您可以为它们创建单独的接口(interface),每个接口(interface)都扩展 IRepository,例如:

public interface IProfileRepository : IRepository {}

然后你可以使用Windsor的流畅注册API来注册所有实现IRepository的具体类,并通过它们提供的特定服务来注册它们,例如IProfileRepository。

如果您这样做,Windsor 将自动为您解析实现 IRepository 的所有实例,而无需在添加新实现时编写任何新的注册代码。

至于使您的存储库类依赖于 ISession,您可以通过多种方式来实现。我建议不要让它们直接依赖于 session ,而是让它们依赖于一个类,通过该类它们可以获取当前 session (以便您可以在存储库之间共享 session )。网络上有很多关于为什么这是良好实践的信息,只需进行搜索即可。

现在,要真正实现它,您可以:

  • 注册一个类的实例(通过接口(interface)),该实例将为您检索 Windsor 的 session ,并让 Windsor 将该类解析为您的存储库构造函数的参数。

  • 向 Windsor 注册 ISession,并在解析时使用工厂方法检索它。

关于asp.net-mvc - 有人可以解释一下 CaSTLe Windsor 在我的应用程序中是如何工作的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4679816/

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