2009-09-04 10 views
3

如何填寫TODO以使此測試通過?Unity容器:默認情況下使用ContainerControlledLifetimeManager作爲「解決」方法組

class MyClass { } 

[Test] 
public void Singleton_by_default_test() 
{ 
    var parentContainer = GetUnityContainer();   
    var container = parentContainer.GetChildContainer(); 

    // TODO: Add magic here (but do NOT explicitly register MyClass in container!) 

    Assert.AreSame(container.Resolve<MyClass>(), container.Resolve<MyClass>()); 
} 

更新: 存在使用繼承的方式。

public class SingletonContainer : UnityContainer 
{ 
    public override object Resolve(Type t, string name) 
    { 
     var obj = base.Resolve(t, name); 
     RegisterInstance(t, name, obj, new ContainerControlledLifetimeManager()); 
     return obj; 
    } 
} 

我使用container.GetChildContainer()得到容器實例所以這種方法並不適合我。

回答

4

我看到你這個打算。有趣的問題。

我想你可以用Unity Behavior Extension來做你正在做的事情。下面是關於Unity設計的一篇很好的文章,它描述了Unity中某些元素的工作,很多人都不知道: http://msdn.microsoft.com/en-us/library/dd140062.aspx

Unity容器在處理解析請求時基本上使用「策略鏈」 。其中一個策略是LifetimeStrategy

做的是創建一個新的戰略和LifetimeStrategy所以之前在鏈插入,當你的戰略得到一個機會來看看類型,它可以爲該類型在當前註冊ContainerControlledLifetimeManager最簡單的事情容器。它將進入LifetimeStrategy並且已經有一個爲該類型註冊的ContainerControlledLifetimeManager。

這可能是這樣的:

public class MakeEverythingSingletonStrategy : BuilderStrategy 
{ 
    public override void PreBuildUp(IBuilderContext context) 
    { 
      Type objectType = BuildKey.GetType(context.BuildKey); 
      context.PersistentPolicies.Set<ILifetimePolicy>(
        new SingletonLifetimePolicy(), 
        context.BuildKey); 

    } 
} 

你應該能夠這種配置適用於使用Configure<T>方法子容器,傳遞一個配置類,增加了這個新的擴展。

我發現有人的#2一個很好的示例實現自定義BuilderStrategy:

Custom object factory extension for Unity

0

嘗試使用它作爲單身人士。 您可以使用以下conffiguration您MyClass的:*

<type type="MyClass" mapTo="MyClass"> 
    <lifetime type="singleton" /> 
</type> 
+0

你被明確註冊的類型。我不想事先知道我需要的所有類型。 –