gpt4 book ai didi

c# - 代码中的 Windsor Setter 注入(inject)

转载 作者:行者123 更新时间:2023-11-30 18:43:37 25 4
gpt4 key购买 nike

我正在使用 Windsor 在我们的 .Net 项目中执行 IoC,但我在代码中执行 setter 注入(inject)时遇到了困难。

我相信这是因为我全面注册了我的组件,因为最终我希望遗留项目将完全符合 IoC 标准并且主要经过单元测试(好梦!)。

这是我注册 DAO 的方式:

container
.Register(AllTypes.FromAssemblyNamed("MyApp.Business")
.Where(Component.IsInNamespace("MyApp.Business.Dao"))
.WithService.DefaultInterface());

下面是我如何使用 DAO 注册组件:

container
.Register(AllTypes.FromAssemblyNamed("MyApp.Business")
.Where(Component.IsInNamespace("MyApp.MyComponentObject")));

我希望 setter 会在组件中自动获取,但我发现的资源似乎显示需要定义 setter。

不幸的是,我只在配置 XML 中找到了如何执行此操作的示例,而不是在代码中。

我找到了如何在代码中向组件添加参数,但似乎存在局限性。看起来它必须是一个字符串,即使不是这样,它似乎也会迫使我一个一个地声明这些组件,而不是一揽子注册。如果我必须这样做,那段代码会变得很大,不知何故 Windsor 会失去一些对我的吸引力。

我记得在使用 Spring 时,如果一个 bean 被声明为 Autowiring ,它就会毫无问题地注入(inject)它。

我是不是漏掉了温莎的东西?

===============

更多信息:

在将使用 Dao 组件的组件类中,我是这样声明 setter 的:

private IMyDao dao = null;

public IMyDao Dao
{
set { this.dao = value; }
}

我想要 setter 注入(inject)的主要原因是因为我无法在不对遗留应用产生相当大影响的情况下更改构造函数。

===============

更新:

已经注释掉了我的大部分注册代码,只留下这个来查看它是否适用于简单的案例场景,但它没有:

//DAOs
container.Register(

Component.For<IMyDao>()
.ImplementedBy<MyDao>()
.Named("myDao"),

//Components
Component.For<MyComponentObject>()
.Parameters(Parameter.ForKey("Dao").Eq("myDao")));

我在代码被轰炸的地方以及属性的 set 上放置了一个断点,并且 DAO 依赖项在我的组件和 set 中仍然是 null 属性的行实际上从未被调用。

最佳答案

CaSTLe Windsor 的 setter 注入(inject)确实正常工作。

[TestClass]
public class SetterInjectionTest
{
[TestMethod]
public void TestMethod1()
{
var container = new WindsorContainer();
container.Register(Component.For<IServiceB>().ImplementedBy<ServiceB>());
container.Register(Component.For<IServiceA>().ImplementedBy<ServiceA>());
var serviceA = container.Resolve<IServiceA>();

Assert.IsTrue(serviceA.IsPropertyInjected());
}
}

public class ServiceA : IServiceA
{
public IServiceB B { get; set; }

public bool IsPropertyInjected()
{
return B != null;
}
}

public interface IServiceA
{
bool IsPropertyInjected();
}

public class ServiceB : IServiceB{}
public interface IServiceB{}

关于c# - 代码中的 Windsor Setter 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4190292/

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