Я столкнулся со следующей проблемой
Учитывая этот псевдокод,
public interface IA
{
...
}
public interface IB
{
IA someOptionalDependency;
}
public interface IRepositoryA
{
...
IA GetDefault();
IA Get(object Id);
}
public interface IFactoryB
{
IB Create();
IB Create(IA a);
}
public class B : IB
{
public B(IRepositoryA repoA)
{
_repoA=repoA;
}
public IA someOptionalDependency {
get{
if (_someOptionalDependency==null)
_someOptionalDependency=_repoA.GetDefault();
return _someOptionalDependency;
}
set{
if (_someOptionalDependency!=null)
throw(new Exception("This is read only");
_someOptionalDependency=value;
}
}
private IA _someOptionalDependency;
private IRepositoryA _repoA;
}
[TestFixture]
public class Test
{
[Test]
public void FactoryMethodsShouldWork()
{
var factoryB=container.Resolve<IFactoryB>();
var repoA=container.Resolve<IRepositoryA>();
var someA=repoA.Get(someID);
var B1=factoryB.Create();
var B2=factoryB.Create(someA);
Assert.AreEqual(repoA.GetDefault(),B1.someOptionalDependency);
Assert.AreEqual(someA,B1.someOptionalDependency);
}
}
Я использую средство Typed Factory для фабрики и регистрирую все в контейнере.Тест не проходит, потому что контейнер всегда разрешает необязательную зависимость A и помещает в нее новый объект, поэтому someOptionalDependency никогда не будет нулевым;Теперь вот хитрость: если я установлю зависимость на [DoNotWire], она не разрешит ее (очевидно) ни в коем случае, для обоих заводских методов мне нужно, чтобы windsor разрешил ее только из именованных аргументов, которые фабрикаобъект внедряется в разрешающий конвейер, а не из типизированного разрешающего.Есть ли способ настроить или расширить виндзор, чтобы сделать это.Я что-то упускаю здесь?Я могу обойти это, создав обертку Factory, чтобы установить значение и установить его в [DoNotWire], но у меня есть эта проблема на нескольких фабриках, и, похоже, это должен быть способ заставить ее работать более корректно
Заранее спасибо