6

アプリケーション間に .dll の階層化されたシステムがあり、最下位レベルには特定の機能を提供するクラスがあります。このクラスのインスタンスは GetClass() 関数を介して受け取ることができ、そのプロパティ (基本的にはコレクション) にアクセスできます。変化するオブジェクトの情報)。

ここで、次の上位レベルの .dll からその情報にアクセスしたいときに、コンパイラが下位レベルの .dll (クラスを定義するもの) を参照していないと文句を言うことに気付きました。これは実際には避けたいと思います。私のアーキテクチャには素晴らしい階層構造があります。

これを回避する方法は?参照された型を再公開できますか? まったく同じ機能が必要な場合、本当に独自のラッパーを作成する必要がありますか? それとも、低レベルの .dll を再度参照する必要がありますか?

DLL 1:

class myClass;
myClass GetMyClass();

DLL 2:

myClass GetMyClass();

EXE:

DLL 1 を参照せずに GetMyClass (DLL 2) を呼び出して結果にアクセスする方法は?

4

6 に答える 6

4

すべてのレイヤーで使用するすべての共通クラスを新しい dll に分離し、すべてのプロジェクトでこの dll を参照する必要があります。

具体的な実装ではなく、コントラクト (機能) を操作できるように、インターフェイスを使用するようにしてください。不要な参照を避けるのに役立ちます。

// common dll
public interface IMyClass
{
    string MyData { get; set; }
    IMyClass GetMyClass();
}

// dll1
public class myClass : IMyClass
{
    public string MyData { get; set; }
    public IMyClass GetMyClass() { return new myClass() { MyData = "abc" }; }
}

// dll2
public class myClass2
{
    public IMyClass GetMyClass()
    {
         var c1 = new myClass();
         var c2 = c1.GetMyClass();
         return c2;
    }
}

// exe (references common and dll2)
public class Program
{
    public static void Main(string[] args)
    {
        var c1 = new myClass2();
        IMyClass c2 = c1.GetMyClass();
        Console.Writeline(c2.MyData);
    }
}
于 2013-04-03T16:23:23.567 に答える
1

呼び出し元は、アクセスしている型を知るために、DLL1 内のクラスへの参照を持っている必要があります。はい、exeの最初のdllを参照する必要があります。GetMyClass() は DLL1 で型を返すため、その型を exe で公開する必要があるため、dll1 を参照する必要があります。

于 2013-04-03T16:18:36.100 に答える