代码之家  ›  专栏  ›  技术社区  ›  Vadim

Unity 2.0:如何使用ResolverOverride的Resolve?

  •  60
  • Vadim  · 技术社区  · 16 年前

    我开始做越来越多的工作 Unity . 我注意到解析器方法需要 论点 罗非利特 .

    有人能给我举个例子说明我如何使用 或者给我点别的线索。

    3 回复  |  直到 12 年前
        1
  •  111
  •   Jason Aller    8 年前

    正如您所注意到的,这是Unity2的一个新特性(非常酷的特性)

    • 在解析类时将参数传递给构造函数。在Unity1中,当您通过newinjectionconstructor(…)注册类型时,您只能设置一个值

    有 ParameterOverride : 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; }
    
        }
    }
    

    我不知道谷歌为什么对此保持沉默。

    引用自Unity源代码xml文档。

        2
  •  46
  •   Konamiman    15 年前

    为了以防万一有人感兴趣,我做了一个扩展方法,使解析的语法使用 ParameterOverride 更容易阅读。方法如下:

    public static class UnityExtensions
    {
        public static T Resolve<T>(this IUnityContainer container, object parameterOverrides)
        {
            var properties = parameterOverrides
                .GetType()
                .GetProperties(BindingFlags.Public | BindingFlags.Instance);
            var overridesArray = properties
                .Select(p => new ParameterOverride(p.Name, p.GetValue(parameterOverrides, null)))
                .Cast<ResolverOverride>()
                .ToArray();
            return container.Resolve<T>(null, overridesArray); //null needed to avoid a StackOverflow :)
        }
    }
    

    这样,您就可以重写ParameterOverride示例,如下所示:

    var service = container.Resolve<IConcreteService>(new {val=3});
    

        3
  •  14
  •   Ciaran O'Neill    14 年前

    Container.Resolve<IConcreteService>(new ParameterOverrides
    {                                                                                   
      {"val", 42}
    });
    
    推荐文章