2016-04-21 5 views
0

「周囲物体」とは、常にバックグラウンドで何かをしていることを意味しますが、他の誰も知りません。たとえば、さまざまなオブジェクト上のイベントに自身をフックし、発生時にメッセージを記録するオブジェクトです。登録された "アンビエント"オブジェクトを強制的に解決する方法はありますか?

問題はUnityビルダーを除いて誰もこのオブジェクトが存在することを知っている誰も誰も解決せず、決して作成されないということです。この問題に対する洗練されたソリューションはありますか? container.ResolveAll<AmbientObject>()(やる、

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

は、各ケースのためにAmbientObjectラッパー内ambientsを返すファクトリメソッドを作成Unityとそれらをすべて登録した後、構図のルートを持っている:

私はそうのようなダミーのクラスを作成することができます戻り値は無視してください)。すべてが作成されていることを確認するだけですが、それはまったくエレガントではありません。

+0

あなたがプラットフォームを使用していますか? MVC、コンソールWPFなど?あなたはOWINを使用できますか? – smoksnes

+0

@smoksnes WPF – dlf

+0

いつ作成しますか?他のオブジェクトが解決されたとき、または起動時に? – smoksnes

答えて

1

Unityに自動的にインスタンスをバックグラウンドで解決させたいと思っています。

はおそらくそれを行う方法がたくさんありますが、私は2を考えることができます:レイジーであなたのコンテナを作成するときに

1.がそれを実行してください。

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

関連する問題