问题描述
|
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