Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windsor Setter代码中的注入_C#_Castle Windsor_Ioc Container_Code Injection_Setter - Fatal编程技术网

C# Windsor Setter代码中的注入

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"

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

我相信这是因为我对我的组件进行了全面注册,因为最终我希望遗留项目将完全符合IoC标准,并且大部分是经过单元测试的(美梦!)

以下是我注册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,因为我使用“过滤器”来注册我的所有组件。我希望温莎能帮我做到,真的。你做错了,请举一个正确的例子好吗?还有什么我需要添加到我的帖子来验证我做的事情是正确的吗?