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();
}
}
}
Мой вопрос в том, что это поведение можно отключить, если я захочу, чтобы класс не разрешался автоматически (либо с возбуждением исключения, либо с возвратом нуля?)
Ответ 1 · рейтинг 1 · Chris Tavares
Он не встроен, но вы можете написать расширение контейнера, которое изменит это поведение. Для этого потребуются две вещи: во-первых, обработчик события регистрации, который записывает, когда тип был зарегистрирован в списке политик, а во-вторых, стратегия, которая будет проверять политику "зарегистрирован" и выбрасывать, если ее там нет.
Его довольно мало, и его легко сделать, если вы знакомы с написанием расширений. К сожалению, у меня нет времени, чтобы собрать его прямо сейчас, извините.
Ответ 2 · Jason Evans
Вы можете использовать Resolve<>(), передав регистрационное имя, как описано здесь. Поэтому попробуйте передать регистрационное имя, которого не существует, и посмотрите, что произойдет. Надеюсь, это обойдет логику отражения Unity и вернет объект NULL.
Ответ 3 · Alexus1024
Подумайте об использовании интерфейсов. Что-то вроде этого:
interface IFoo{...}
class Foo:IFoo{...}
// ...
var foo = container.Resolve<IFoo>(); // Exception here