在温莎城堡以编程方式列出注册类型的最简单方法是什么?
谢谢
我正在将依赖注入框架引入现有的WebForms应用程序(使用Castle Windsor).
我对DI有很深的经验,并且倾向于非常强烈地支持构造函数注入而不是setter注入.如果您熟悉Webforms,您就会知道ASP.Net框架处理页面和控件对象的构造,从而无法进行真正的构造函数注入.
我目前的解决方案是在Global.asax的Application_Start事件中注册容器,并将容器保存为Global中的公共静态变量.然后,我只需在页面中直接解析我需要的每项服务,或在需要时控制它.所以在每个页面的顶部,我最终得到这样的代码:
private readonly IMyService _exposureManager = Global.IoC.Resolve<IMyService>();
private readonly IMyOtherService _tenCustomersExposureManager = Global.IoC.Resolve<IMyOtherService>();
Run Code Online (Sandbox Code Playgroud)
显然,我不喜欢将所有这些对容器的引用分散在我的应用程序中,或者我的页面/控件依赖关系是非显式的,但我还是找不到更好的方法.
在Webforms中使用DI有更优雅的解决方案吗?
我目前对Castle Windsor注册的理解是,只能通过在根组件上调用Resolve来验证注册.但是,由于windsor的组件模型知道每个组件的依赖关系,因此应该可以测试是否可以满足所有依赖关系而无需实际实例化任何内容.想要执行此操作的主要原因是要进行单元测试以进行注册,这不需要我在启动时调用调用外部资源的组件.
例如.我有一个依赖于IChild的类Root:
public class Root : IRoot
{
private IChild child;
public Root(IChild child)
{
this.child = child;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将Root注册为IRoot,但不注册IChild.当我打电话给这样的决心:
var container = new WindsorContainer().Register(
Component.For<IRoot>().ImplementedBy<Root>()
);
container.Resolve<IRoot>();
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
MyNamespace.Root is waiting for the following dependencies:
Services:
- MyNamespace.IChild which was not registered.
Run Code Online (Sandbox Code Playgroud)
是否有类似的东西:
container.TestResolve<IRoot>();
Run Code Online (Sandbox Code Playgroud)
这将走依赖图并检查是否可以满足所有依赖关系,但实际上并没有实例化任何依赖关系?
我对IoC/windsor来说是全新的.我从谷歌开始学习它,但不幸的是,我没有得到适当的文档,这对我来说更容易理解.所以我来这里有这样的标题/问题.
每个文档/页面(网页),像这样开始类似的东西
"我们应该从注册类/接口开始,然后解决它......"
但是没有一个页面显示有关如何实现这一目标的完整文档,我也尝试制作一个简单的项目,但是我没能运行它.我不知道如何解决容器,在哪里/如何调用install(),我完全搞砸了.
任何人都可以帮我一个示例项目,其中包括注册/安装的完整演示?
提前致谢 :)
我有一个关于Castle Windsor的简单问题,我很久没有使用过了.我正在尝试使用特定实例注册服务,该实例将是服务的单例实现.
容器无法尝试创建服务本身的实现,因为它具有容器无法解析的依赖项.我有一个服务实例,我希望它是唯一一个用于请求服务的人的实例.但我似乎很少运气.
我通过使用这段代码暂时提出了希望:
container.Register(Component.For<IMyInterface>().Instance(serviceObj));
Run Code Online (Sandbox Code Playgroud)
但是所有Castle都与实例一起做了一个.GetType()并注册了这个类型.对服务的请求随后将导致容器尝试创建该类型,并在无法填充依赖项时失败.
那么有什么方法可以做我想做的事情吗?如果不是,我将创建某种IServiceProvider来获取服务的实例,并且没有容器的依赖关系来填写.但这比正确的解决方案更像是一种解决方案.
有什么建议?谢谢!
我有一个自定义成员资格/角色提供程序,我在我的MVC控制器中使用,我也希望ASP.NET MVC可以访问,所以我可以使用AuthorizationFilters等.由于很多人已经实现了自定义提供程序,我想很多人都做过这个,但我没有想出来或发现专门解决这个问题的帖子.这篇文章有点像我的问题的另一面.在我的情况下,我的自定义提供程序与我的控制器配合良好,我也希望MVC也能使用它.
我的提供程序使用IoC /依赖注入设计实现.提供程序公开了基线成员资格/角色API之外的其他功能.在我的控制器中,我使用Castle Windsor创建实例.代码看起来类似于:
public class HomeController : Controller {
IMembershipService _membershipService;
public HomeController(IMembershipService membershipService) {
_membershipService= membershipService;
}
}
<castle>
<components>
<component id="MembershipService"
service="IMembershipService, MyApp"
type="MembershipService, MyApp" lifestyle="PerWebRequest">
<parameters>
<connectionString>#{defaultConnectionString}</connectionString>
</parameters>
</component>
</components>
</castle>
public class WindsorControllerFactory : DefaultControllerFactory {
private WindsorContainer _container;
public WindsorControllerFactory() {
_container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));
List<Type> controllerTypes = new List<Type>();
foreach (Type t in Assembly.GetExecutingAssembly().GetTypes()) {
if (typeof(IController).IsAssignableFrom(t))
controllerTypes.Add(t);
}
foreach (Type t in controllerTypes) {
// LifestyleType.Transient = …Run Code Online (Sandbox Code Playgroud) asp.net-mvc dependency-injection castle-windsor asp.net-membership
看过NInject如何做到这一点,AutoFac可以做到这一点我试图弄清楚如何使用Castle Windsor将依赖注入MVC ActionFilters
目前我正在使用一个丑陋的静态IoC助手类来解析构造函数代码中的依赖关系,如下所示:
public class MyFilterAttribute : ActionFilterAttribute
{
private readonly IUserRepository _userRepository;
public MyFilterAttribute() : this(IoC.Resolve<IUserRepository>()) { }
public MyFilterAttribute(IUserRepository userRepository)
{
_userRepository = userRepository;
}
}
Run Code Online (Sandbox Code Playgroud)
我想从我的过滤器中删除静态反模式IoC的东西.
任何暗示我将如何与温莎城堡一起做这件事?
不,改变DI框架不是一种选择.
所以我的公司使用Castle Windsor IoC容器,但感觉"关闭":
设计系统的人坚持认为IoC容器使系统更好.我们有1200多个公共类,所以它是一个很大的系统,你期望找到像Windsor这样的框架.但我仍然持怀疑态度.
我的公司是否有效地使用IoC?使用Windsor的新对象比使用new关键字的新对象更有优势吗?
我试图对城堡windsor进行一些测试,在我的一个测试中我想检查windsor安装程序,所以我检查容器可以解析我的组件给定其界面.
到目前为止,这么好,问题开始时组件在其安装程序中具有PerWebRequest生活方式,起初它抱怨HttpContext.Current为null,有一个解决了在测试设置中创建假上下文我现在在nunit中有这个异常测试
System.Exception:看起来你忘记注册http模块Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule在你的web.config部分添加''.如果您在集成模式下运行IIS7,则需要将其添加到下面的部分
当我从NUnit运行它时,我如何在windsor中注册模块或类,以便它可以工作,或者如何模拟,因为在此测试中并不是真正的Web请求,只需检查容器是否解析了类型.
如果我在真正的webrequest之外使用这个组件进行任何集成测试,也有同样的事情会发生,有没有办法让这个工作或真的模拟一个Web请求,这样这个测试可以运行?
Tranks提前
费尔
我想知道为什么.Net IoC容器不能轻易支持单个接口的多个实现!可能是我错了,但就我所见,像Ninject这样的框架部分支持使用注释这个功能(如何?).我不认为像Windsor或简单注入器这样的其他框架有一个简单的机制来支持这种情况.
是否有任何理由不支持许多框架?AFAIK,使用接口的最重要原因之一是实现松散耦合.如果框架旨在改善松散耦合,不能流利地支持单个接口的多个实现,我不明白为什么!
PS当然我理解在运行时会出现解决问题,容器会混淆选择哪种实现,但这是设计中必须考虑的事情,对吧?
castle-windsor ×10
c# ×4
asp.net-mvc ×2
.net ×1
asp.net ×1
castle ×1
components ×1
testing ×1
webforms ×1