6

ASP.NET MVC アプリケーションでリポジトリ パターンを使用する場合、プログラムに通知するために DI が必要であり、クラスをマッピングする必要があります。Unity を実装する場合、DAL プロジェクトを MVC プロジェクトに追加し、型を global.asax に登録する必要があります。

私の考えでは、DALレイヤーの名前空間をMVCプロジェクトに追加するのは悪いと思います。間にビジネスレイヤーもあります。ビジネス レイヤーに DAL クラスを挿入し、MVC アプリにビジネス レイヤー マッピングのみを挿入するのは美しいと思います。

ここに行く方法は何ですか?提案はありますか?

更新:私に明確にするために。サービス層には、ビジネスおよびデータ アクセス層の DTO と DI のみがあります。サービス層では、DTO をドメイン モデルにマップします。私が理解できないのは、ビジネス層のメソッドをどのように呼び出すことができるかということです。

4

3 に答える 3

4

実用的になりたい場合は、真の 3 層アーキテクチャにはサービス層が必要です。サービスと MVC の間には、データ転送オブジェクト (DTO) があります。サービス層は、DAL とビジネス層の両方を隠します。

このように設定すると、MVC 自体は DAL について何も認識せず、DTO とサービス (コントラクト) のみを認識します。

于 2013-04-02T17:40:17.483 に答える
3

個別のサービス レイヤーを使用しなくても、DI を使用して MVC アプリケーションを DAL プロジェクトから分離するという目的を達成できます。

これを行う方法は、定義したインターフェイスの特定のインスタンスを使用して IoC コンテナーを接続する間に、いくつかのプロジェクト/アセンブリを追加することです。

私は通常、次の命名規則を使用します。

  • MyCompany.MyProject.Infrastructure

  • MyCompany.MyProject.Abstract

メイン MVC プロジェクトは、Abstract および Infrastructure プロジェクトへの参照を持ちます。インフラストラクチャ プロジェクトには、Abstract への参照と、Business および DAL プロジェクトのようなインスタンス固有のプロジェクトがあります。インフラストラクチャ プロジェクト内で、依存関係を結び付けます。

インフラストラクチャ アセンブリで IoC をブートストラップするには、MVC プロジェクトのメカニズムをセットアップする必要があります。これは、global.asax または App_Start メソッドとして実行し、Infrastructure アセンブリ内で Registration クラスを呼び出すことができます。

StructureMap を使用していますが、コンセプトは同じです。ここにいくつかのサンプルコードがあります。

MVC アプリで、App_Start メソッドを作成して DI をセットアップします。

public static class StructuremapMvc
{
    public static void Start()
    {

        // Create new Structuremap Controller factory so Structure map can resolve the parameter dependencies.
        ControllerBuilder.Current.SetControllerFactory(new StructuremapControllerFactory());

        IContainer container = IoC.Initialize();

        DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));

        GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container);
    }
}

インフラストラクチャ アセンブリで、依存関係を結び付けます。

public static class IoC
{
    public static IContainer Initialize()
    {
        ObjectFactory.Initialize(x =>
                    {
                        x.Scan(scan =>
                                {
                                    scan.TheCallingAssembly();
                                    scan.WithDefaultConventions();
                                });
                        x.For<IRepositoryNum1>().Use<Num1Repository>();
                        x.For<IRepositoryNum2>().Use<Num2Repository>();
                        x.For<IRepositoryNum3>().Use<Num3Repository>();
                    });

        return ObjectFactory.Container;
    }
}
于 2013-04-02T17:55:26.677 に答える
0

DI を使用して、Domain/DAL インターフェイスをコンストラクターに挿入する必要があります。これには、単体テストを作成するときにインターフェイスを moq できるなど、多くの利点があります。Autofac を使用してインジェクションを処理できます。

于 2013-04-02T17:45:10.683 に答える