在Castle Windsor中注入一个属性(并覆盖它的构造函数设置)

时间:2014-05-12 20:45:47

标签: c# dependency-injection castle-windsor ioc-container

我有一个具有属性的组件我想在某些情况下覆盖。
简短版本是 -

public interface IMyClass
{
  public string SomeValue {get; }
}

public class MyClass : IMyClass
{
   public string SomeValue {get; set;}

   public MyClass()
   {
     //do nothing related to SomeValue
   }

   public MyClass(IHelper helper)
   {
      SomeValue = helper.ReadFromAConfigurationFile();
      //other code follows, unrelated to SomeValue
   }
}

稍后,按照建议here我做..

var classParams= new Dictionary<string, string> { { "SomeValue", "A New Value" } }

    Component.For<IMyClass>()
        .ImplementedBy<MyClass>()
        .DependsOn(classParams)
        .Named("NamedInstanceGoesHere")
        .LifestyleTransient());

最后,我解决了我的组件:

var myComponent= container.Resolve<IMyClass>("NamedInstanceGoesHere");

当我检查myComponent时,SomeValue的值与构造函数中的值相同,而不是我试图覆盖它。

有没有办法做我以后的事情?为什么IMyClass没有SomeValueMyClass的公开制定者,我不确定,但它可能会导致我的问题......

1 个答案:

答案 0 :(得分:1)

我尝试了下面的代码,它执行正常而不会触发断言。即使有IHelper注册。对我来说,似乎你可能正在做一些稍微不同的事情。

祝你好运,

Marwijn。

using System.Collections.Generic;
using System.Diagnostics;
using Castle.MicroKernel.Registration;
using Castle.Windsor;

namespace ConsoleApplication1
{
    public class IHelper
    {

    }

    public interface IMyClass
    {
        string SomeValue { get; }
    }

    public class MyClass : IMyClass
    {
        public string SomeValue { get; set; }

        public MyClass()
        {
            //do nothing related to SomeValue
        }

        public MyClass(IHelper helper)
        {
            SomeValue = "hello";
        }
    }

    class Program
    {
        static void Main()
        {

            var container = new WindsorContainer();

            var classParams = new Dictionary<string, string> { { "SomeValue", "A New Value" } };

            container.Register(
              Component.For<IHelper>(),
              Component.For<IMyClass>()
                .ImplementedBy<MyClass>()
                .DependsOn(classParams)
                .Named("NamedInstanceGoesHere")
                .LifestyleTransient());

            var myObject = container.Resolve<IMyClass>("NamedInstanceGoesHere");

            Debug.Assert(myObject.SomeValue == classParams["SomeValue"]);
        }
    }
}