2016-04-21 35 views
0

通過「環境對象」,我的意思是總是在背景中做一些事情,但沒人知道。例如,一個將自身掛接到各種其他對象上的事件並在它們觸發時記錄消息的對象。如何強制註冊的「環境」對象被解決?

問題是:由於除了Unity構建器以外,沒有人知道這個對象存在,所以沒有人能解決它,並且它永遠不會被創建。有沒有一個優雅的解決這個問題?

我可以創建一個虛擬類,像這樣:

public class AmbientObject 
{ 
    public object TheObject { get; set; } 
} 

創建工廠方法返回內部AmbientObject包裝的環境溫度是針對每一種情況下,用統一註冊他們,然後有組成根做了container.ResolveAll<AmbientObject>()(並忽略返回值),只是爲了確保它們全部被創建,但這並不完美。

+0

哪個平臺您使用? MVC,控制檯WPF等?你可以使用OWIN嗎? – smoksnes

+0

@smoksnes它是WPF – dlf

+0

你想什麼時候創建它?其他對象解決時,還是啓動時? – smoksnes

回答

1

聽起來你希望Unity在後臺自動解析你的實例。

很可能有大量的做這件事的方式,但我可以想到兩個:

創建與懶惰的容器中時就這樣做。

public static class IocContainer 
{ 

    private IMyAmbient _ambient; 
    private static readonly Lazy<IUnityContainer> Container = new Lazy<IUnityContainer>(() => 
    { 
     var container = new UnityContainer(); 

     // Do your registration. 
     container.RegisterType<IMyAmbient, Ambient>(); 
     _ambient = container.Resolve<IMyAmbient>(); 
     _ambient.DoStuff(); 
     return container; 
    }); 

    public static IUnityContainer Instance 
    { 
     get { return Container.Value; } 
    } 
} 

2.註冊一個UnityContainerExtension

public static class IocContainer 
{ 
    private static readonly Lazy<IUnityContainer> Container = new Lazy<IUnityContainer>(() => 
    { 
     var container = new UnityContainer() 
      .AddNewExtension<AmbientCreation>(); 
     container.RegisterType<IMyAmbient, Ambient>(); 
     return container; 
    }); 

    public static IUnityContainer Instance 
    { 
     get { return Container.Value; } 
    } 
} 

public class AmbientCreation: UnityContainerExtension 
{ 

    protected override void Initialize() 
    { 
     // Using PreCreation, but you may want another one? 
     Context.Strategies.AddNew<AmbientCreationStrategy>(UnityBuildStage.PreCreation); 
    } 
} 

public class AmbientCreationStrategy: BuilderStrategy 
{ 

    private IUnityContainer GetUnityFromBuildContext(IBuilderContext context) 
    { 
     var lifetime = context.Policies.Get<ILifetimePolicy>(NamedTypeBuildKey.Make<IUnityContainer>()); 
     return lifetime.GetValue() as IUnityContainer; 
    } 

    public override void PreBuildUp(IBuilderContext context) 
    { 
     // Runs at every resolve. Now you can decide when to create your ambient object. 
    } 
} 

我使用後來創建基於堆棧的日誌對象。也許它可以讓你朝正確的方向發展?兩種選擇的不利之處在於,根本沒有魔法可言。它只是將邏輯移動到應用程序的另一部分。有人可能會認爲BuildStrategies不應該用於此目的。

更多信息: http://weblogs.asp.net/ricardoperes/unity-part-10-custom-build-strategies

相關問題