- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经开始使用温莎城堡,不知怎的,我的应用程序已经全部启动并运行,但我不太明白它是如何工作的。不要让我引用文档,否则我就不会在这里。
在我的 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/
我正在实现 hangFire,它是我项目中的作业调度库。 我面临着与此 link 中相同的问题 然而,将 LifestylePerWebRequest() 替换为 HybridPerWebReques
在我的项目中,我需要同时使用 CaSTLe.Windsor 和 Moq dll。 Windsor 要求 CaSTLe.Core 也在项目中被引用。 当我尝试使用 CaSTLe.Core 中的方法时,问
我已将我的解决方案从城堡版本 1.0 更新到版本 3.0,现在我收到此错误: Type Castle.Facilities.FactorySupport.FactorySupportFacility
我的应用程序使用“SignalR”客户端/服务器通信框架。如果您不熟悉它,服务器端应用程序通常包含一个或多个“集线器”类(类似于 asmx 网络服务),每个类都提供可由客户端调用的方法。在启动期间,客
假设我有这样的组件 public class MyComponent { public MyComponent(string name) { } } 我基本上想让提供的构造函数
我想知道是否有一些最佳实践来实现我需要的功能。 我有一个 Web 应用程序,它在启动期间通过反射扫描某些程序集(插件)并针对公共(public)内核注册它们的依赖项。 外部库可能需要相同的依赖项。 例
我想知道是否有一些最佳实践来实现我需要的功能。 我有一个 Web 应用程序,它在启动期间通过反射扫描某些程序集(插件)并针对公共(public)内核注册它们的依赖项。 外部库可能需要相同的依赖项。 例
是否有关于如何使用 CaSTLe Windsor 的自动事务管理的任何简单示例? documentation似乎缺少一些信息。我看到有用于 nHibernate、ActiveRecord 等的工具……
这是一次回答,但从那时起下载站点已经改变(显然)。我根本找不到 CaSTLe.MicroKernel。 2.51 不能再下载,它不在 2.52 中。或 2.53。 最佳答案 没有Castle.Micr
我正在将我们的项目从 .Net 2 升级到 .Net4.5,同时我将尽可能多的引用推送到 NuGet 并确保版本是最新的。 我在运行其中一项测试时遇到问题 测试类: public cl
当我开始使用 Windsor 时,我认为 DI 会很简单。现在它让我越来越困惑。 在我看来,存储库是一个具有单例生命周期的类。我应该有一个 FooRepository 实例来在应用程序的生命周期内将
我有一个接口(interface) ISession,其实例由不同的 session 工厂生成,具体取决于类所属的命名空间。 我的组件注册示例: IWindsorContainer container
我正在关注 example by José F. Romaniello使用 NHibernate 进行 session 管理。这是一篇非常好的文章,但是我在 NHibernate、Windsor 和
我有一个看似简单的用例。有一个 ICsvReader 组件。让我们在这里简单地将它命名为 Reader。我们加载了一组已知的 CSV 文件,其中一些有标题,有些没有。目前有多个阅读器:Reader_S
试图找出这件事的真正原因,但并没有太多乐趣! Type is not resolved for member 'Castle.MicroKernel.Lifestyle.Scoped.CallCont
这是我在 Global.asax 中的代码 WindsorContainer container = new WindsorContainer(); container.Register(Compo
我正在尝试了解如何使用 CaSTLe ActiveRecord 执行自定义查询。 我能够运行返回我的实体的简单查询,但我真正需要的是如下所示的查询(带有自定义字段集): 选择 count(1) 作为
在使用 ArrayResolver 时,如果我注册了一个接口(interface)的多个实现和一个依赖于所述接口(interface)数组的类,我希望数组解析器注入(inject)所有可以成功解析的接
我为服务注册了两个组件: container.Register( Component.For().Named("FirstChoice").ImplementedBy... Compo
有没有人有一些使用城堡 Windsor InstallerFactory 来订购安装程序的示例代码? 似乎无法在文档或其他地方找到它。 干杯 最佳答案 您只能使用 InstallerFactory与
我是一名优秀的程序员,十分优秀!