Единица 2.0: Как использовать Твердость с ResolverOverride?

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

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

65
задан Ray Booysen 10 June 2014 в 14:17
поделиться

1 ответ

Как вы заметили, это новая (и действительно крутая функция) Unity 2. Эта функция позволяет вам

  • передать параметры конструктору в момент, когда вы разрешаете класс. В Unity 1 вы можете установить только одно значение в момент регистрации типа через new InjectionConstructor (...)

Существует ParameterOverride: ResolverOverride

Класс ResolverOverride, который позволяет вам переопределить именованный параметр, переданный конструктору .

  • то же самое для зависимостей с DependencyOverride: ResolverOverride

Класс, который переопределяет значение , вводимое всякий раз, когда существует зависимость данного типа, независимо от где он появляется на графе объекта .

  • то же самое для свойств с PropertyOverride: ResolverOverride

ResolverOverride, который позволяет вам переопределить значение для указанного свойства.

Пример

using System;
using Microsoft.Practices.Unity;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {

            var container = new UnityContainer();

            //ParameterOverride example

            container.RegisterType<IConcreteService, ConcreteService>(
                new InjectionConstructor(7) //Old way to pass value to constructor - not flexible. 
                                            //All resolved (without override which appears only in unity 2.0) classes will have val=7
                );

            var service0 = container.Resolve<IConcreteService>();
            Console.WriteLine(service0.Val); //prints 7

            var service = container.Resolve<IConcreteService>(new ParameterOverride("val", 3));
            Console.WriteLine(service.Val); // prints 3

            var service2 = container.Resolve<IConcreteService>(new ParameterOverride("val", 5));
            Console.WriteLine(service2.Val); // prints 5

            Console.ReadLine();

            //DependencyOverride example

            var b0 = container.Resolve<B>(new DependencyOverride<IConcreteService>(new ConcreteService(42)));
            Console.WriteLine(b0.Service.Val); //print 42
            Console.WriteLine(b0.Service1.Val); //print 42

            var b = container.Resolve<B>(new DependencyOverride<IConcreteService>(new ConcreteService(-42)));
            Console.WriteLine(b.Service.Val); // print -42
            Console.WriteLine(b.Service1.Val); // print -42

            Console.ReadLine();

            //PropertyOverride example 

            var b1 = container.Resolve<B>(new PropertyOverride("Service", new ConcreteService(42)), 
                new PropertyOverride("Service1", new ConcreteService(-42)));
            Console.WriteLine(b1.Service.Val); //print 42
            Console.WriteLine(b1.Service1.Val); //print -42

            Console.ReadLine();



        }
    }

    public interface IConcreteService {
        int Val { get; set; }
    }
    public class ConcreteService : IConcreteService {

        public int Val { get; set; }

        public ConcreteService(int val) {
            Val = val;
        }
    }

    public class B {
        [Dependency]
        public IConcreteService Service{ get; set; }

        [Dependency]
        public IConcreteService Service1 { get; set; }

    }
}

Понятия не имею, почему Google умалчивает об этом.

Цитаты взяты из xml-документов исходного кода Unity.

108
ответ дан 24 November 2019 в 15:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: