2

「インターフェース」と呼ばれるプロジェクトに次のようなインターフェースがあるとします。

public interface TestInterface
{
    string Operation();
}

そしてそれを実装するクラス。このクラスは、別のプロジェクト「クラス」にあります。

public class TestClass : TestInterface
{
    public TestClass() { }

    public string Operation()
    {
        return "This is an Operation";
    }
}

私のクライアントは次のようなことをします(これもまた別のプロジェクト「クライアント」にあります):

class Program
{
    static void Main(string[] args)
    {
        TestInterface i = new TestClass();
        i.Operation();
    }
}

私の質問はこの行に関連しています:

TestInterface i = new TestClass();

この行を追加することにより、実際には、「クライアント」プロジェクトから「インターフェース」プロジェクトと「クラス」プロジェクトの両方への参照を追加する必要があります。では、なぜこの大騒ぎなのか?「インターフェース」を挟まずに「クラス」を直接参照することはできませんか?(実装クラスを参照せずに)インターフェイスのみを介してメソッドにアクセスする方法はありますか?ここで何かが足りませんか?

4

5 に答える 5

2

インターフェイスのみを介してメソッドにアクセスする方法はありますか

はいあります。アセンブリをTestClass参照せずに動的にロードし、そのインスタンスを作成しActivator.CreateInstanceてインターフェイス タイプにキャストできます。

var assembly = Assembly.Load(...);
var typeFromAssembly = assembly.GetTypes()...;
var myInterfaceVar = (TestInterface)Activator.CreateInstance(typeFromAssembly);

...または... 既存の DI フレームワーク (MEF など) の 1 つを使用して、同じことをより適切な方法で行うことができます。

[Import]
private TestInterface myInterfaceField;

また:

var myInterfaceVar = compositionContainer.GetExportedValue<TestInterface>();

好みの方法によっては、より具体的な質問をすることもできます。

于 2013-01-24T10:03:55.223 に答える
0

コードを実装から完全に独立させるには、Dependency InversionTestInterfaceを使用します。これは、一部の依存性注入フレームワークによって実現できます。

たとえば、Unityを使用すると、xml 経由で実装を構成できます

<register type="TestInterface" 
          mapTo="Foo.Bar.TestClass, Foo.Bar" />

また、コードは Unity のみに依存します (実装への参照はありません)。

TestInterface i = Container.Resolve<TestInterface>();
于 2013-01-24T10:04:47.257 に答える
0

あなたのアプリが持つことができるようにあなたはインターフェースを持っていplug in'sます..

したがって、基本的には、アプリのプラグイン アプリを作成したい人にインターフェイス dll を共有し、その新しいプラグイン クラスをインターフェイスにキャストしてメソッドを呼び出すことができます。

クラスをインターフェースにキャストしない場合、プラグインクラスをアプリで機能させるにはどうすればよいでしょうか..

于 2013-01-24T10:10:35.430 に答える
0

その特定のサンプルでは、​​利点はありません。

しかし、方法を想像してください:

public void Foo(ITestInterface handler)
{
    handler.Operation();
}

現在、Fooインターフェイスでのみ動作し、このインターフェイスを実装する具体的なクラスは気にしません。別のアセンブリで定義できるまたはFooのインスタンスを使用して呼び出すことができるようになりました。TestClassTestClass2

于 2013-01-24T10:05:21.993 に答える
0

IOCを使用して、説明した動作を実現できます。 Unityは、手動でインスタンスを作成せずにインスタンスを作成できる依存性注入コンテナーです。

たとえば、クラスとインターフェイスを unity に登録する場合は、インターフェイスを直接使用します。

TestInterface i = Container.Resolve<TestInterface>();
于 2013-01-24T10:05:31.230 に答える