Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Можно ли отключить автоматическое создание экземпляров UnityContainer?

Автор вопроса: Mike NunanОтветов: 3

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();
        }
    }
}

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

ioc-containerunity-container

Ответы

Ответ 1 · рейтинг 1 · Chris Tavares

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

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

Ответ 2 · Jason Evans

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

Ответ 3 · Alexus1024

Подумайте об использовании интерфейсов. Что-то вроде этого:

interface IFoo{...}
class Foo:IFoo{...}
// ...
var foo = container.Resolve<IFoo>(); // Exception here

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы