2

私のプロジェクトでは、とりわけ IRepositoryProvider に対するコントローラーの依存関係がありました。

public class HomeController : BaseController
{
    public HomeController(ISessionWrapper sessionWrapper,
                          IRepositoryProvider repositoryProvider,
                          IApplicationConfiguration applicationConfiguration)
        : base(sessionWrapper, repositoryProvider, applicationConfiguration)
    {}

    ...

}

IRepositoryProvider とその実装は、BLL レイヤーに存在します。もう 1 つ注意すべき点は、IRepositoryProvider にもいくつかのパラメーターがあることです。これらは、使用する接続文字列を決定するために使用されます (環境*5 可能な接続)。

    public RepositoryProvider(string environment, IApplicationConfiguration applicationConfiguration)
    {
        _applicationConfiguration = applicationConfiguration;
        _environment = environment;
    }

これはすべて、2 つのレイヤーとこの Ninject 構成で正常に機能します。

kernel.Bind<IRepositoryProvider>()
      .To<RepositoryProvider>()
      .InRequestScope()
      .WithConstructorArgument("environment",    
                                context => context.Kernel.Get<ISessionWrapper>().CurrentEnvironment)
      .WithConstructorArgument("applicationConfiguration",
                                context => context.Kernel.Get<IApplicationConfiguration>());

サービスレイヤーを導入したときに問題が発生しました。データ アクセスをコントローラーで IRepositoryProvider に依存する代わりに、サービス レイヤーを使用したいと考えています。理想的には、BLL レイヤーを参照せずに、サービス レイヤーのみを参照したいと考えています。

public class HomeService : IHomeService
{
    public IRepositoryProvider RepositoryProvider { get; private set; }

    public HomeService(IRepositoryProvider repositoryProvider)
    {
        RepositoryProvider = repositoryProvider;
    }
    ...
}

私の質問はこれです: MVC プロジェクトからサービス層と BLL 層の両方を参照しないことは可能ですか? それとも、このセットアップ全体が大規模なコードの匂いですか?

ありがとう。

更新: 私は私の理想的な参照を言うべきだったと思います. Web -> サービス -> BLL。現時点では、Web は Service と BLL の両方を参照して、Ninject がすべてを解決できるようにします。

更新 2: これは可能な解決策のように思えますか? 参照を持たない実装にバインドするように Ninject に指示する方法

4

2 に答える 2

3

これは、要件に応じて、通常、MVC プロジェクトを設計する方法です。

プレゼンテーション レイヤー > サービス レイヤー > ビジネス レイヤー > データ アクセス レイヤー。

プレゼンテーション レイヤーには、ViewModels、Views、Controllers が含まれます。(サービス層、Ninject ddl を参照)

サービス層: WCF。(BALなどを参照)

ビジネス層 : 私がオーケストレーターと呼ぶものとそのインターフェース (参照 DAL、ドメイン) が含まれています。

データ アクセス レイヤー: リポジトリとそのインターフェイス (参照ドメイン) が含まれています。

ドメイン: POCO オブジェクトが含まれます

Core : Ninject を実際にインストールして構成する場所 (BAL、DAL などを参照)

Ninject をプレゼンテーション層以外の別のプロジェクトに追加するには:

以下を Global.Asasx.cs に追加します。

DependencyResolver.SetResolver(new NinjectDependencyResolver());

次に、新しいプロジェクト sucche をコアとして作成します。そこに Ninject をインストールし、次のクラスを追加します。

プレゼンテーション レイヤーから Ninject dll を参照する必要があります。

 public class NinjectDependencyResolver : IDependencyResolver {
    private IKernel kernel;

    public NinjectDependencyResolver() 
    {
        kernel = new StandardKernel();
        AddBindings();
    }

    public object GetService(Type serviceType) 
    {
        return kernel.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType) 
    {
        return kernel.GetAll(serviceType);
    }

    public IBindingToSyntax<T> Bind<T>() 
    {
        return kernel.Bind<T>();
    }

    public IKernel Kernel 
    {
        get { return kernel; }
    }

    private void AddBindings() 
    {
        //Add your Bindings here
    }

}
于 2013-04-19T18:09:39.993 に答える
2

IRepositoryProvider とその実装は BLL レイヤーに存在します... MVC プロジェクトからサービス レイヤーと BLL レイヤーの両方を参照しないことは可能ですか?

あなたのこれらの2つのステートメントでは、答えはNOです。これらのレイヤーを「参照しない」ことはできません。参照を最小限に抑える最善の方法は、インターフェイスを実装から分離することです。たとえば、次のようにすることができます。

Domain Layerには、POCO とインターフェイスが含まれています

  • 製品 (サンプル クラス)
  • IRepository (インターフェース)

Service Layerには、インターフェースの実装が含まれています

  • Domainレイヤーへの参照を持っている
  • 道具IRepository(例ProductRepository : IRepository

依存性注入レイヤー

  • DomainServiceレイヤーの両方を認識している

MVC プロジェクト

  • DomainPOCO とリポジトリの署名について知るためにレイヤーへの参照を用意する
  • レイヤーへの参照がありますが、DIそれが正確にどのように機能するかわかりません。したがって、後で DI フレームワークを交換しても、すべてが機能します。

必要に応じてそのレイヤーを展開できます。とレイヤーBLLの間にレイヤーを挿入でき、どこでも参照する必要はありません。DomainService

于 2013-04-19T18:22:56.877 に答える