Замок Виндзор странное поведение с инъекцией собственности и фабричным методомC#

Место общения программистов C#
Ответить
Anonymous
 Замок Виндзор странное поведение с инъекцией собственности и фабричным методом

Сообщение Anonymous »

Я использую Castle Windsor 2.5.1 в проекте ASP.NET MVC и использую инъекцию свойств, чтобы создать объект, который, как я ожидаю, всегда будет доступен в классе базового контроллера. Я использую фабрику для создания этого объекта, однако, если в конструкторе есть ошибка, я вообще не получаю предупреждение от Виндзора, и она просто возвращает мой объект, но без введения собственности. < /P>

Это ожидаемое поведение, и если так, как я могу вызвать ошибку, когда завод не сможет что -то вернуть? Пример < /p>

Код: Выделить всё

public class MyDependency : IMyDependency
{
public MyDependency(bool error)
{
if (error) throw new Exception("I error on creation");
}
}

public interface IMyDependency
{
}

public class MyConsumer
{
public IMyDependency MyDependency { get; set; }
}

[TestFixture]
public class ProgramTest
{
[Test]
public void CreateWithoutError() //Works as expected
{
var container = new WindsorContainer().Register(
Component.For().UsingFactoryMethod(() => new MyDependency(false)).LifeStyle.Transient,
Component.For().LifeStyle.Transient
);

var consumer = container.Resolve();

Assert.IsNotNull(consumer);
Assert.IsNotNull(consumer.MyDependency);
}

[Test]
public void CreateWithError_WhatShouldHappen() //I would expect an error since it can't create MyDependency
{
var container = new WindsorContainer().Register(
Component.For().UsingFactoryMethod(() => new MyDependency(true)).LifeStyle.Transient,
Component.For().LifeStyle.Transient
);

Assert.Throws(() => container.Resolve());
}

[Test]
public void CreateWithError_WhatActuallyHappens() //Gives me back a consumer, but ignores MyDependency
{
var container = new WindsorContainer().Register(
Component.For().UsingFactoryMethod(() => new MyDependency(true)).LifeStyle.Transient,
Component.For().LifeStyle.Transient
);

var consumer = container.Resolve();

Assert.IsNotNull(consumer);
Assert.IsNull(consumer.MyDependency); //Basically fails silently!
}
}
Интересное наблюдение, если я использую это в своем приложении MVC, я получаю внутреннюю ошибку от Виндзора при вызове Releasecomponent - поэтому, даже если он не вернул мне класс с моей зависимость>

Подробнее здесь: https://stackoverflow.com/questions/439 ... ory-method
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»