2011-05-26 29 views
3

UnityContainer.Resolve()將實例尚未通過反射的方式被明確登記類,允許這樣的事情:是否可以禁用UnityContainer的自動實例化行爲?

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(); 
     } 
    } 
} 

我的問題是,這是可能的,如果我想禁用此行爲,以便該類不會自動解析(要麼引發異常,要麼返回空值)

回答

0

它不是內置的,但你可以編寫一個容器擴展來改變這種行爲。它需要兩件事情 - 首先是註冊事件的處理程序,用於在策略列表中註冊類型時進行記錄;其次,策略將檢查「已註冊」策略並拋出,如果它不存在則拋出。

其相當小&如果您熟悉書寫擴展功能,很容易做到。不幸的是,我現在沒有時間把它們放在一起,對不起。

+0

謝謝你們的回覆。克里斯指出我在正確的方向,非常感謝。 – 2011-05-28 08:23:31

0

您可以通過傳遞註冊名稱來使用Resolve<>(),如here所述。所以請嘗試傳遞一個不存在的註冊名稱並查看會發生什麼。希望這將繞過Unity的反射邏輯並返回一個NULL對象。

+0

不,自動創建邏輯保持不變 - 名稱只是內部註冊列表的關鍵。如果它在列表中找不到任何內容,則默認啓用。 – 2011-05-26 17:50:39

+0

感謝您澄清此問題。我會在這裏保留這個答案,以防其他人需要知道這一點。 – 2011-05-30 20:01:58

0

考慮使用接口。 類似這樣的:

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