1

В настоящее время я просматриваю блок приложений Microsoft Unity, чтобы использовать его в одном из моих личных проектов. Я прочитал несколько статей и руководств об этом, но у меня есть вопрос об этом.Создание объекта с использованием Unity Application Block

В this example about the framework они используют Unity для создания объекта, который наследует интерфейс IVehicle. Те 3 класса, которые наследуют от него, не имеют никаких свойств, которые должны быть инициализированы в конструкторе, поэтому все работает хорошо.

Очевидно, что в моем проекте это не всегда так. У меня будут некоторые классы, для которых требуется инициализация свойства (или поля) в конструкторе. Мой вопрос: как мне это достичь? Или это то, что Единство не может сделать само по себе; Мне нужно было бы создать объект, используя функцию Unity Resolve(), которая предоставила бы мне объект с неинициализированными полями/свойствами, а затем мне пришлось бы вызывать сеттер один за другим по каждому полю/свойствам?

ответ

2

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

Например, давайте говорить, что у вас есть класс Car реализация ICar, что зависит от другого класса IEngine с помощью инъекции конструктора (Car's конструктор требует параметра типа IEngine).

public interface ICar 
{ 
    void Accelerate(); 
} 

public interface IEngine 
{ 
    void Accelerate(); 
} 

public class Car: ICar 
{ 
    private readonly IEngine _engine; 
    public Car(IEngine engine)  
    { 
     _engine = engine; 
    } 

    public void Accelerate() 
    { 
     _engine.Accelerate(); 
    } 
} 

public class Engine: IEngine 
{  
    public Engine()  
    {  
    } 

    public string Message {get; set;} 

    public void Accelerate() 
    { 
     Console.WriteLine("Accelerating." + Message); 
    } 
} 

Вы зарегистрируйте в Unity, как разрешить ICar и IEngine:

var _container = new UnityContainer() 
        .RegisterType<ICar,Car>() 
        .RegisterType<IEngine,Engine>(
          new InjectionProperty("Message", "Hello world")); 

Тогда, когда вы решить ICar Unity будет в состоянии предоставить экземпляр Engine к Car конструктора, ауто- проводя зависимость, которую автомобиль имеет на IEngine. Это также верно для любых дополнительных зависимостей, которые могут иметь Car или Engine, и любые свойства, зарегистрированные для инъекций.

var car = _container.Resolve<Car>(); 
car.Accelerate(); 

Accelerating.Hello мир

Таким образом, путем разрешения в ICar Unity даст вам полный граф объектов необходимо. Вы можете попробовать образец in this fiddle

EDIT

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

public interface IFoo 
{ 
    DateTime ResolvedTime {get; set;} 
} 

public class Foo: IFoo 
{ 
    public DateTime ResolvedTime {get; set;} 
} 

//Can be registered using a lambda as in: 
container.RegisterType<IFoo,Foo>(
      new InjectionFactory(c => new Foo{ ResolvedTime = DateTime.Now })); 

Вы можете получить некоторые info on the msdn. Я также обновил скрипку выше этим примером лямбда.

+0

Ваш ответ помог мне лучше понять. Но что произойдет, если, скажем, «Engine» необходимо «Сообщение», которое я мог бы предоставить позже, во время разрешения, и я не знал этого «Message» в регистре времени в начале моего приложения? Единство кажется очень ограниченным для меня тем, что вы должны предоставить все параметры конструкторам, всем свойствам и т. Д. В самом начале вашего приложения, когда вы регистрируете свои объекты. Разве я что-то не хватает? – Choub890

+0

Вы также можете зарегистрировать тип, используя лямбду, которая будет выполнена во время выполнения. Если этого недостаточно, вы можете создать абстрактный заводский интерфейс, например 'ICarFactory', чтобы какой-то класс мог зависеть от этой фабрики и называть что-то вроде carFactory.CreateCar() вместо того, чтобы напрямую зависеть от' ICar' –

+0

Можете ли вы привести пример, используя Единство с выражением лямбда для регистрации типа в вашем ответе выше? Или указать мне на документацию? – Choub890

Смежные вопросы