Можно ли отключить автоматическое создание экземпляров UnityContainer? - PullRequest
3 голосов
/ 26 мая 2011

UnityContainer.Resolve () будет создавать экземпляры классов, которые не были явно зарегистрированы с помощью рефлексии, что позволяет такие вещи:

using System;
using Microsoft.Practices.Unity;

namespace ConsoleApplication2
{
    public class Foo
    {
        public void SayHello()
        {
            Console.WriteLine("Hello");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var container = new UnityContainer();
            var foo = container.Resolve<Foo>();
            foo.SayHello();
        }
    }
}

Мой вопрос, возможно отключить это поведение, если яхотите, чтобы класс не разрешался автоматически (либо с возникновением исключения, либо с возвращением нулевого значения?)

Ответы [ 3 ]

0 голосов
/ 26 мая 2011

Он не встроен, но вы можете написать расширение контейнера, которое изменит это поведение.Для этого потребуются две вещи: во-первых, обработчик для регистрирующего события, записывающего запись, когда тип был зарегистрирован в списке политик, и, во-вторых, стратегия, которая проверяет политику «зарегистрирован» и выдает ее, если ее там нет.

Это довольно мало и легко сделать, если вы знакомы с написанием расширений.К сожалению, у меня нет времени собрать это прямо сейчас, извините.

0 голосов
/ 25 апреля 2013

Рассмотрите возможность использования интерфейсов. Примерно так:

interface IFoo{...}
class Foo:IFoo{...}
// ...
var foo = container.Resolve<IFoo>(); // Exception here
0 голосов
/ 26 мая 2011

Вы можете использовать Resolve<>(), передав регистрационное имя, как объяснено здесь . Поэтому попробуйте передать регистрационное имя, которое не существует, и посмотрите, что произойдет. Надеемся, что это обойдет логику отражения Unity и вернет объект NULL.

...