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

时间:2011-05-26 15:36:30

标签: .net unity-container ioc-container

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?)

3 个答案:

答案 0 :(得分:0)

您可以通过传递注册名称来使用Resolve<>(),如here所述。因此,尝试传递一个不存在的注册名称,看看会发生什么。希望这会绕过Unity的反射逻辑并返回NULL对象。

答案 1 :(得分:0)

它不是内置的,但您可以编写一个容器扩展名来改变这种行为。它需要两件事 - 首先是注册事件的处理程序,在策略列表中注册类型时记录,第二,检查“已注册”策略的策略,如果不存在则抛出。

它相当小&amp;如果您熟悉编写扩展程序,则很容易做到。不幸的是,我现在没时间把它们放在一起,抱歉。

答案 2 :(得分:0)

考虑使用接口。 像这样:

interface IFoo{...}
class Foo:IFoo{...}
// ...
var foo = container.Resolve<IFoo>(); // Exception here