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?)
答案 0 :(得分:0)
您可以通过传递注册名称来使用Resolve<>()
,如here所述。因此,尝试传递一个不存在的注册名称,看看会发生什么。希望这会绕过Unity的反射逻辑并返回NULL
对象。
答案 1 :(得分:0)
它不是内置的,但您可以编写一个容器扩展名来改变这种行为。它需要两件事 - 首先是注册事件的处理程序,在策略列表中注册类型时记录,第二,检查“已注册”策略的策略,如果不存在则抛出。
它相当小&amp;如果您熟悉编写扩展程序,则很容易做到。不幸的是,我现在没时间把它们放在一起,抱歉。
答案 2 :(得分:0)
考虑使用接口。 像这样:
interface IFoo{...}
class Foo:IFoo{...}
// ...
var foo = container.Resolve<IFoo>(); // Exception here