0
public class A
{
    public X x { get; set; }
}

public class B
{
    public X x { get; set; }
}

public class X
{
    public X(object owner) { /* ... */ }
}

基本的に、クラスAとがウィンザーに登録されている場合、必要なクラスのインスタンスを取得するような方法で依存関係Bを解決できるようにしたいと考えています。X

単純なコードでは、次のようになります。

var a = new A();
var x = new X(a);
a.X = x;

おそらくいくつかの拡張メカニズムを通じて、ウィンザーでこれを行う方法はありますか?


私にとってもクレイジーな質問のように見えるので、その背後にある動機を次に示します。

上記Xの例の は、トレースされた各メッセージにいくつかの情報、つまり所有者の一意の ID とそのタイプを追加するITracerためのプロキシですTraceSource(現在は ID のみです - それが質問です - 私は取得できません)インスタンスに移動GetType()してそれを呼び出します)。

より明確にするための簡単な例。何らかのサービスがIServiceあり、最も邪魔にならない方法でトレースを追加したいとします。ただし、アプリケーションにはこのサービスのインスタンスが数十個存在する可能性があるため、トレースではそれらを ID/タイプで区別する必要があります。TraceSourceクラスがコンテナーからトレーサーを受け取り、ID や具象などを考えずに、必要に応じてそこにメッセージを書き込むとよいでしょう。

私はすでにそのように書くことを可能にするいくつかのインフラストラクチャを持っています:

[TracedTo("NameOfTheTraceSource")]
public class Service : IService
{
    public ITracer Tracer { get; set; }
}

また、Windsor は、 nameを指すTracer独自の (他のオブジェクトと共有されていない) インスタンスであると正しく解決されます。さらに、属性に追加すると、Windsor は自動的にインターセプターを追加します。インターセプターは、同じ方法でこのインスタンスの各メソッド呼び出しを書き留めます(対応するリスナーが構成されている場合にのみこれを行います。飛ぶ)。これは、開発者から何も要求されず、必要のないときにパフォーマンスが低下することもないため、非常に優れています。そして、私はこれをさらに便利にするために取り組んでいます:)ITracerTraceSourceNameOfTheTraceSourcetraceAllMethods = trueTracerTraceSourceService

4

1 に答える 1