2016-05-13 19 views
1

私はクライアント、ライブラリ、およびインターフェイスを中間層として持つアプリケーションを用意しています。ライブラリのクラスはInterfaceを実装しています。ライブラリを参照せずに呼び出すことができます。だから私はこれを行う必要はありません:インターフェイスのみを使用してクラスのインスタンスを作成する方法

IInterface myClass = new Library.MyClass(); 

1つの方法は、Unityを使用することです。他の方法はありますか?どういうわけか、インタフェースのアイデアはすぐに消えてしまいます。

ありがとうございました

+0

「参照しなくてもライブラリを呼びたい」という意味は? – SeM

+0

その理由から、インタフェースがあります。クライアントはLibrary1、Library2、Library3を気にするべきではありません。ライブラリの新しいインスタンスを直接呼び出すと、インタフェースの目的が失われます。 – sis

答えて

1

これを行うにはいくつかの方法があります。 1つは、Dependency Inversionを使用してUnityで表示し、もう1つはクラスファクトリを作成して、最後に、先ほどお話したように、クラスインスタンスを新しく作成します。

私の個人的な好みは、依存性の逆転になりがちです。ここで、Structuremapは私のお気に入りのIoCコンテナです。セットアップが非常に簡単で、使いやすいですが、ほとんどのIoCコンテナは非常によく文書化されています。

あなたは、通常で終わる事はの同類に何かある:

IInterface myClass = myContainer.GetInstanceOf<IInterface>(); 
+0

このrequier参照をdosntしますか? – Thorarins

+0

直接ではありません。ほとんどのコンテナでは、実装を含むすべてのDLLをロードできるようになり、インタフェースを実装自体に解決することができます。したがって、IoCの設定では、通常、このdllとそのdllを追加するようにコンテナに指示するだけで、コンテナは残りの処理を行います。 –

+0

ので、コンテナは私が答えたものを正確に行います。:) – Thorarins

1

私は右だ場合、ライブラリはサードパーティのコンポーネントではありません、あなたは実装を変更することができます!もしそうなら、私はMEFを使うことを勧めます。これは.Netフレームワークの一部であり、必ずしも参照されていない他のアセンブリからコンポーネントを読み込んで、必要なものを正確にサポートします。あなたのライブラリーで

は、エクスポート属性でアプリあなたの中に使用するクラスを宣言する必要があります。

[Import(typeof(IInterface))] public IInterface myClase; 

[Export(typeof(IInterface))] class MyClass : IInterface{ } 

そして、あなたのクライアントアプリケーションでは、あなたがコンポーネントをインポートすることができます

最後に、すべてのインポートとエクスポートを作成することができます:

var catalog = new AggregateCatalog(); 

// add assamby by type 
catalog.Catalogs.Add(new AssemblyCatalog(typeof (AnyType).Assembly)); 

// add assembly by path 
// this example adds all assembly in the current directory that ends with "Extension.dll". 
catalog.Catalogs.Add(new DirectoryCatalog(@".", "*Extensions.dll")); 
var container = new CompositionContainer(catalog); 

// compose parts: MEF composes all imports and exports 
container.ComposeParts(this); 
1

これは通常行われますb y Factoryデザインパターンを使用します。

public interface IMyInterface 
{ 
} 

public class A : IMyInterface 
{ 
    internal A() // so, the user/developer won't be able to call "var a = new A()" outside of the scope of the assembly 
    { 
    } 
} 

public class B : IMyInterface 
{ 
    internal B() 
    { 
    } 
} 

public static class MyFactory 
{ 
    public static IMyInterface CreateA() 
    { 
     return new A(); 
    } 

    public static IMyInterface CreateB() 
    { 
     return new B(); 
    } 
} 

使用:あなたはAPIを作成する場合は、内部へABのコンストラクタを設定することができますので、開発者はなく、それらのインスタンスを作成することができません

static void Main() 
{ 
    IMyInterface a = MyFactory.CreateA(); // instance of A 
    IMyInterface b = MyFactory.CreateB(); // instance of B 
} 

工場を使用します。

注:ファクトリを使用して、作成したインスタンスを保存することができます。したがって、毎回新しいインスタンスを作成するのではなく、同じインスタンスを返します。

+0

例をありがとう、それは非常に有用だった!私は問題に対処するための選択肢が増えるので、ペドロの答えを受け入れました。 – sis

+1

うれしい私は助けることができました!その答えは、Dependency Injectionの視点からの仕事ですが、私はDesign Patternなので、一緒に働くことができます。特にAPIを作成している場合は特にそうです。質問のために、その答えはより良いです。 :) – KAI

関連する問題