1

私は現在、ServiceLocatorのFluentインターフェイスを構築しようとしています。各開発者が1対nのマッピングを簡単に設定できるようにするため

こんなもの欲しい

ServiceLocator.Instance.For<IFoo>(Use<Foo>(), Use<FooBar>());

シングルトンは正常に機能しています...Forメソッドのmethodsignatureは次のようになります

public void For<TInterface>(params type[] services)
{
// ... 
}

だから私はグローバルメソッドのようなものを探していました

C#にはいくつかのグローバルメソッドがあり、すべてのメソッドはSystem.Objectで定義されています。しかし、System.Objectで新しい汎用ExtensionMethodを作成すると、メソッドは表示されません。

public static class MyExtensions
{
  public static void Use<T>(this Object instance)
  {
    // ..
  }
}

MethodChainingが代替手段になりますが、このアプローチはセクシーに見えます:D

誰かアイデアはありますか?

4

3 に答える 3

2

さて、実際にの拡張メソッドを作成するとObject、それが表示されます。のように、

public static class Extensions
{
    public static void doStuff<T>(this T myObject)
    {
    }
}

class Program
{
    static void Main(string[] args)
    {
        int a = 5;
        a.doStuff();

        string b = "aaa";
        b.doStuff();

        List<int> c = new List<int>() { 1, 2, 3, 10 };
        c.doStuff();

        Extensions.doStuff(c);        
    }
}

私はあなたの質問を誤解しましたか?

于 2011-09-24T18:18:29.200 に答える
1

using拡張メソッドを表示するには、拡張メソッドを含む名前空間のステートメントを追加する必要があります。に拡張メソッドを追加することobjectはめったに良い考えではありません。

編集:さて、今私はあなたが何を求めているのか理解しています。拡張メソッドを使用するには、インスタンスが必要です。オブジェクトの静的拡張メソッド(EqualsとReferenceEqualsは静的メソッドです)を要求していますが、それは不可能です。オブジェクトに拡張メソッドを定義すると、すべてのインスタンスで使用できるようになりますが、それはあなたが望むものではないと確信しています。

public static class ObjectExtensions
{
    public static string TypeFullName(this object obj)
    {
        return obj.GetType().FullName;
    }
}

static void Main(string[] args)
{
    var obj = new object();
    Console.WriteLine(obj.TypeFullName());

    var s = "test";
    Console.WriteLine(s.TypeFullName());
}
于 2011-09-24T18:24:41.713 に答える
1

Service Locator はアンチパターンであると広く考えられています。また、共通の登録インターフェースは、特定のコンテナーを使用する必要がない限り、解決できない問題であると広く考えられています。

Forこれら 2 つの疑わしい決定を見過ごした後、複数の型引数を受け入れるオーバーロードを定義することで、グローバル メソッドの必要性を取り除くことができます。

ServiceLocator.Instance.For<IFoo, Foo, FooBar>();

メソッドは次のForようになります。

public void For<TInterface, TImplementation>()

public void For<TInterface, TImplementation1, TImplementation2>()

...

型カウントごとにオーバーロードを定義する必要がありますが、最小限の構文と最大限の発見可能性が必要です。参考までに、.NET Framework のActionおよびFunc型は 9 個の型引数をサポートしています。

しかし、これを書いた後、質問を誤解したのではないかと思います:なぜ同じインターフェースに複数の実装を指定するのですか? 解決するときにあいまいさにつながりませんIFooか?

于 2011-09-24T18:33:19.190 に答える