3

私はモッキングと依存性注入に不慣れで、いくつかのガイダンスが必要です。

私のアプリケーションは、BLL が DAL を参照し、UI が BLL を参照するが DAL を参照しない典型的な N 層アーキテクチャを使用しています。かなり簡単です。

たとえば、次のクラスがあるとします。

class MyDataAccess : IMyDataAccess {}
class MyBusinessLogic {}

それぞれが別のアセンブリに存在します。

MyBusinessLogic のテストで MyDataAccess をモックしたいと考えています。そこで、MyBusinessLogic クラスにコンストラクターを追加して、依存性注入用の IMyDataAccess パラメーターを取得しました。しかし、UI レイヤーで MyBusinessLogic のインスタンスを作成しようとすると、DAL への参照が必要になります。

MyBusinessLogic でデフォルトのコンストラクターを定義して、デフォルトの IMyDataAccess 実装を設定できると考えましたが、これはコードのように見えるだけでなく、実際には問題を解決しませんでした。署名に IMyDataAccess を持つパブリック コンストラクターがまだあります。そのため、UI レイヤーは、コンパイルするために DAL への参照を必要とします。

私が考えている解決策の 1 つは、IMyDataAccess パラメーターを使用して MyBusinessLogic の内部コンストラクターを作成することです。次に、テスト プロジェクトのアクセサーを使用してコンストラクターを呼び出すことができます。でもあの匂いはまだある。

ここでの一般的な解決策は何ですか。私は何か間違ったことをしているに違いない。どうすればアーキテクチャを改善できますか?

4

3 に答える 3

4

次のようにクラスを定義できます。

public class MainForm : Form
{
    private readonly businessLogic;

    public MainForm(IBusinessLogic businessLogic)
    {
        this.businessLogic = businessLogic;
    }
}

public class BusinessLogic : IBusinessLogic
{
    private IDataLayer dataLayer;

    public BusinessLogic(IDataLayer dataLayer)
    {
        this.dataLayer = dataLayer;
    }
}

public class DataLayer : IDataLayer
{
    public DataLayer(string connectionString)
    {
    }
}

ここで、メイン フォームが DAL について認識していないことに注意してください。ここで、すべてのクラスを認識して相互に接続できるようにするコードが必要です。これは通常、アプリケーションの開始時に行われます。

public static void Main(string[] args)
{
   var dataLayer = new DataLayer("foo");
   var businessLogic = new BusinessLogic(dataLayer);
   var mainForm = new MainForm(businessLogic);

   Application.Run(mainForm);
}

もちろん、これは単純化された例です。実際に数十または数百のクラスがある場合、特に循環依存関係が発生した場合、そのような開始時の配線は非常に大きく複雑になる可能性があります。そのため、そのコードを XML 構成ファイル、コードによる構成、または .NET 属性に置き換えるために、依存性注入フレームワークが作成されました。基本的な考え方は同じですが。

.NET の依存性注入フレームワークの例: AutoFacCastleSpring.NETStructureMapNinject、およびManaged Extensibility Framework

于 2010-03-18T23:47:33.833 に答える
2

昨日、あなたの問題を解決すると思われる.NET ソリューションを構築する方法についての質問に答えました。

私の答えの重要なポイントは、「実装」アセンブリのどれも他の「実装」アセンブリへの参照を持たないということです。これにより、懸念事項の分離の問題が解決するはずです。

さらに、構造は依存性注入の使用をほぼ義務付けており、単体テストとモックの使用に非常に適しています。

お役に立てば幸いです。

于 2010-03-18T23:19:12.820 に答える
0

UI dllからデータアクセスdllを参照する必要がない場合は、データアクセスインターフェイス/基本クラスを3番目のライブラリに抽出し、他の2つのライブラリでそれを参照することができます。

于 2010-03-18T23:26:14.583 に答える