Tag: 城堡 温莎

循环依赖树,是否合理

我想出了一些解决方案,我的IoC / DI容器( Castle Windsor )声称有一个循环依赖树。 这是真的。 但我不确定这个循环是否有害。 这或多或少是依赖树: WebAPI控制器取决于…… …… 服务A取决于…… ……工作单位取决于…… ……存储库取决于…… …域事件管理器(1)取决于很多…… …域事件处理程序,一个取决于…… …… 服务A (2) (1) 域事件管理器是一个通用类,旨在协调由相同或其他域监听的具体域事件并执行副操作。 (2)这是依赖循环发生的地方 我的域事件管理和处理是在考虑面向方面的编程时实现的,因此,虽然它是依赖树的一部分,但给定的域事件处理程序可能依赖于或不依赖于同一依赖树中的服务:我认为域事件处理程序,如额外的顶级依赖项 。 但最坏的情况已经发生了。 我的观点是,由于域事件是一个交叉概念,给定的处理程序应该能够注入任何服务,甚至是已经存在于给定操作流的依赖树中的某个服务。 目前,我已经在受影响的域事件处理程序中使用属性注入修复了该问题,但无论如何可能有替代整个解决方法。

Castle Windsordependency injection – 恢复现有实例的依赖关系

我有一个相当直接的场景,我试图解决,但我正在与温莎打几个砖墙 – 也许我试图以错误的方式解决问题? 我有一个名为Foo的类型如下: public class Foo { [NonSerialized] private IBar bar; public IBar Bar { get { return this.bar; } set { this.bar = value; } } public Foo(IBar bar) { } } 我以正常方式通过容器实例化: var myFoo = container.Resolve(); 依赖关系IBar在容器中注册,并在创建对象时得到解析。 既然已经创建了类型,我需要序列化它,我不想序列化IBar,因此它标有NonSerialized属性。 然后我需要反序列化对象并将其返回到它的前状态。 我如何使用Castle Windsor实现这一目标? 我已经有了一个实例,它只是缺少它的依赖项。 如果我使用Unity,我会使用BuildUp()来解决问题,但我想在这种情况下使用Castle Windsor。

在城堡 – 温莎的多个装饰员模式

我们正在重新设计一些遗留软件以使其更易于测试,并决定使用Dependency-Injection和Castle.Windsor来帮助我们。 首先,我们的目标:*许多装饰器都在数据流上工作。 *装饰器的多种组合是可能的,并且每种情况下的根节点可能需要从不同的地方获取数据。 从技术上讲,我们的设计如下: interface IUpdateableValue { T Get(); }; 我们有三组要检索的数据,包含许多组件,都实现了IUpdateableValue()(伪代码): JsonParser( Decompressor( Decrypter(decryptionKey FileCache(filename, HttpWebDownloader(url)))) XmlParser( Decompressor( Decrypter(decryptionKey2 FileCache(filename2, HttpWebDownloader(url2)))) 我无法将设计融入像Castle-Windsor这样的DI框架中。 我怀疑其中一些可能由命名实例处理,但这似乎有点臭这种用法。 这个想法是,例如JsonParser和XmlParser实例的“用户”不知道(或关心)数据是来自HttpUrl,文件还是神奇地从帽子中拉出来的。 我认为我们的设计有问题,但不确定如何修复它。 关于如何进步的任何想法?

Castle Windsor:强制解析器使用指定的构造函数

这是一个例子: interface IComponentA {}; class ComponentA : IComponentA { }; interface IComponentB { }; class ComponentB : IComponentB { }; interface IComponentC { }; class ComponentC : IComponentC { public ComponentC(IComponentA a) { Console.WriteLine(“Constructor A”); } public ComponentC(IComponentB b) { Console.WriteLine(“Constructor B”); } }; 所有这些组件都在Castle Windsor容器中注册。 但是ComponentC类有2个重载的构造函数。 当激活ComponentC时,可以使用它们中的任何一个。 我需要使用ComponentC(IComponentB b)构造函数。 我暂时使用UsingFactoryMethod()方法来解决这个问题: container .Register(Component .For() .ImplementedBy()) […]

使用IoC时,unit testing的策略应该是什么?

毕竟我读过有关dependency injection和IoC的内容我已经决定尝试在我们的应用程序中使用Windsor Container(它是一个50K LOC多层Web应用程序,所以我希望它不是一个矫枉过正)。 我已经使用了一个简单的静态类来包装容器,并在启动应用程序时对其进行初始化,这对于现在来说非常好。 我的问题是关于unit testing。 我知道通过让我可以将类协作者的存根/模拟实现注入到被测试的类中,DI将使我的生活变得更加轻松。 我已经使用这种技术编写了几个测试,这似乎对我有意义。 我不确定的是我是否应该在unit testing中使用IoC(在本例中为Windsor Castle)(可能以某种方式将其配置为针对我的特殊情况返回存根/模拟)或者是否更好地连接所有依赖项在测试中手动。 你怎么想,什么做法对你有用?

将ASP.NET MVC Controller属性注入服务层依赖项?

我正在使用类似于ASP.NET MVC教程中的方法 ,您将控制器的ModelState集合中的包装器传递给validation类,以便控制器可以访问错误信息。 这是一个熟练的例子: interface IProductValidator { void Validate(Product item); } class ProductValidator { // constructor public ProductValidator(ModelStateWrapper validationDictionary) { } } interface IProductService { void AddProduct(); } public class ProductService : IProductService { // constructor public ProductService(IProductValidator validator) { } } 使用Castle Windsor容器进行IoC / DI,如何创建IProductService ? 通常,我会: MvcApplication.IocContainer.Resolve() 但是这不能将Controller的ModelState属性的值注入到ProductValidator的构造函数中。 我可以使用构造函数参数来连接它,但这看起来真的很难看。

我如何对我的控制器进行unit testing,以确保Windsor在使用PerWebRequestLifestyle时可以解析依赖关系

我的申请中有以下unit testing: [TestMethod] public void Windsor_Can_Resolve_HomeController_Dependencies() { // Setup WindsorContainer container = new WindsorContainer(); container.Install(FromAssembly.Containing()); // Act container.Kernel.Resolve(typeof(HomeController)); } 这一点是为了确保我没有任何windsor配置问题,在我访问该控制器上的操作之前我将无法实现。 问题是我的所有对象注册都被注册为PerWebRequestLifestyle所以我不会遇到我的entity framework数据上下文在Web请求之间共享的问题(这会在运行多个操作时导致错误)。 但是,每当我运行此unit testing时,我都会遇到以下exception: System.InvalidOperationException:HttpContext.Current为null。 PerWebRequestLifestyle只能在ASP.Net中使用 如何在不改变对象注册命令的生活方式的情况下测试此场景?

温莎城堡在哪里以及如何建立伐木设施

我对Castle Windsor很新,我正在研究伐木设施的进出口。 它似乎相当令人印象深刻,但我唯一无法解决的是Windsor在我的类上设置Logger属性。 如下所示,如果尚未设置类,则将Logger设置为nullLogger,但是当Resolve完成运行时,将设置Logger属性。 private ILogger logger; public ILogger Logger { get { if (logger == null) logger = NullLogger.Instance; return logger; } set { logger = value; } } 所以我想知道windsor如何以及在哪里设置我的Logger属性。 干杯安东尼

Castle Windsor:如何将所有接口实现注入ctor?

我编写了一个由多个类实现的接口。 我想写一个Service类,它将所有注册的实现注入到它的ctor中。 我能想到的唯一解决方案是在ctor中调用服务定位器并要求它解决()所有实现。 理想情况下,我想要这样的东西 – interface IVehicle { void Start(); } class Car : IVehicle { public void Start() { Console.WriteLine(“Car started.”); } } class Truck : IVehicle { public void Start() { Console.WriteLine(“Truck started.”); } } class Motorbike : IVehicle { public void Start() { Console.WriteLine(“Motorbike started.”); } } class VehicleService { // How […]

看似循环的依赖导致Castle Windsor的问题

我有一个IUserService(和其他服务),我在ServiceInstaller.cs中批量注册: container.Register( AllTypes.FromAssemblyContaining() .Where(type => type.Name.EndsWith(“Service”)) .WithService.DefaultInterface() .Configure(c => c.LifeStyle.Singleton) ); 然后,我有IAuthenticationService,我在我的通用WindsorInstaller.cs文件中注册: container.Register(Component.For(typeof (IAuthenticationService)) .ImplementedBy(typeof(AuthenticationService))); 现在一切正常,直到我在UserService中为IAuthenticationService添加了一个公共属性。 当事情被注册时,似乎存在循环依赖或某些时间问题,因为我收到错误: Can’t create component ‘ABCD.Services.UserService’ as it has dependencies to be satisfied. ABCD.Services.UserService is waiting for the following dependencies: Services: – ABCD.Services.Interfaces.IAuthenticationService which was registered but is also waiting for dependencies. ABCD.Services.AuthenticationService is waiting for the following dependencies: Services: […]