我有一个具有属性的组件我想在某些情况下覆盖。
简短版本是 -
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
没有SomeValue
和MyClass
的公开制定者,我不确定,但它可能会导致我的问题......
答案 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"]);
}
}
}