C# Windsor Setter代码中的注入
我正在使用Windsor在我们的.Net项目中执行IoC,但在代码中执行setter注入时遇到困难 我相信这是因为我对我的组件进行了全面注册,因为最终我希望遗留项目将完全符合IoC标准,并且大部分是经过单元测试的(美梦!) 以下是我注册DAO的方式:C# Windsor Setter代码中的注入,c#,castle-windsor,ioc-container,code-injection,setter,C#,Castle Windsor,Ioc Container,Code Injection,Setter,我正在使用Windsor在我们的.Net项目中执行IoC,但在代码中执行setter注入时遇到困难 我相信这是因为我对我的组件进行了全面注册,因为最终我希望遗留项目将完全符合IoC标准,并且大部分是经过单元测试的(美梦!) 以下是我注册DAO的方式: container .Register(AllTypes.FromAssemblyNamed("MyApp.Business") .Where(Component.IsInNamespace("MyApp.Business.Dao"
container
.Register(AllTypes.FromAssemblyNamed("MyApp.Business")
.Where(Component.IsInNamespace("MyApp.Business.Dao"))
.WithService.DefaultInterface());
container
.Register(AllTypes.FromAssemblyNamed("MyApp.Business")
.Where(Component.IsInNamespace("MyApp.MyComponentObject")));
下面是我如何使用DAO注册组件:
container
.Register(AllTypes.FromAssemblyNamed("MyApp.Business")
.Where(Component.IsInNamespace("MyApp.Business.Dao"))
.WithService.DefaultInterface());
container
.Register(AllTypes.FromAssemblyNamed("MyApp.Business")
.Where(Component.IsInNamespace("MyApp.MyComponentObject")));
我希望setter能在组件中自动获取,但我找到的资源似乎表明需要定义setter
不幸的是,我只在配置XML中找到了如何做到这一点的示例,而没有在代码中找到
我在代码中找到了如何向组件添加参数,但似乎存在一些限制。看起来它必须是一个字符串,即使不是这样,它似乎会迫使我一个接一个地声明这些组件,而不是简单地注册。如果我必须这样做,那么代码将变得巨大,不知何故,温莎将失去它对我的一些吸引力
我记得使用Spring时,如果一个bean被声明为autowiring,它将注入它而不会出现任何问题
我是不是错过了温莎
===============
更多信息:
在将使用Dao组件的组件类中,我是如何声明setter的:
private IMyDao dao = null;
public IMyDao Dao
{
set { this.dao = value; }
}
我想要setter注入的主要原因是,如果不对遗留应用程序产生相当大的影响,我无法更改构造函数
===============
更新:
我已经注释掉了我的大部分注册码,只留下此代码,以查看它是否适用于简单的案例场景,但它没有:
//DAOs
container.Register(
Component.For<IMyDao>()
.ImplementedBy<MyDao>()
.Named("myDao"),
//Components
Component.For<MyComponentObject>()
.Parameters(Parameter.ForKey("Dao").Eq("myDao")));
//DAOs
集装箱。登记(
用于()的组件
.由()实施
。名为(“myDao”),
//组成部分
用于()的组件
.Parameters(Parameter.ForKey(“Dao”).Eq(“myDao”));
我在代码爆炸的地方以及属性的
set
上放置了一个断点,DAO依赖项在我的组件中仍然是null
,并且属性的set
行实际上从未被调用。Castle Windsor的setter注入确实工作正常
[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{}
[TestClass]
公共类SetterInjectionTest
{
[测试方法]
公共void TestMethod1()
{
var container=新的WindsorContainer();
container.Register(Component.For().ImplementedBy());
container.Register(Component.For().ImplementedBy());
var serviceA=container.Resolve();
Assert.IsTrue(serviceA.IsPropertyInjected());
}
}
公共类服务A:IServiceA
{
公共IServiceB{get;set;}
公共bool IsPropertyInjected()
{
返回B!=null;
}
}
公共接口
{
bool IsPropertyInjected();
}
公共类服务B:IServiceB{}
公共接口IServiceB{}
我不确定我是否理解您的问题。Windsor默认情况下会满足public setter(如果可以的话)。我的setter是public的,但我没有明确指定哪个组件需要注入哪个setter,因为我使用“过滤器”来注册我的所有组件。我希望温莎能帮我做到,真的。你做错了,请举一个正确的例子好吗?还有什么我需要添加到我的帖子来验证我做的事情是正确的吗?