是否可以禁用UnityContainer的自动实例化行为?

问题描述

| 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();
        }
    }
}
我的问题是,如果我想禁用此行为是可能的,这样就不会自动解决该类(引发异常或返回null吗?)     

解决方法

它不是内置的,但是您可以编写一个容器扩展名来更改此行为。这将需要两件事-首先是用于注册事件的处理程序,该事件用于在策略列表中注册类型时进行记录,其次,该策略将检查“已注册”策略并在是否已注册时抛出该策略。不在那里。 如果您熟悉编写扩展程序,那么它相当小而且容易实现。不幸的是,我现在没有时间集合在一起,对不起。     ,您可以通过传递注册名称来使用
Resolve<>()
,如此处所述。因此,请尝试传递不存在的注册名称,然后看看会发生什么。希望这将绕过Unity的反射逻辑并返回一个“ 2”对象。     ,考虑使用接口。 像这样:
interface IFoo{...}
class Foo:IFoo{...}
// ...
var foo = container.Resolve<IFoo>(); // Exception here