2

現在、2層のWebサイトを構築しています。

  • Web UI: これは MVC 4 プロジェクトで、ユーザーとの対話に使用されます
  • データ アクセス: これは C# ライブラリです。このレイヤーは、データベースとのやり取りを担当します。

依存性注入に Ninject を使用しています。ここまでは、問題ありません。しかし今、 Web UI と Data Access の間に Business Logic と呼ばれる新しいレイヤーを挿入したいと考えています。したがって、アーキテクチャは次のようになります。

  • Web UI: ビジネス ロジックからのインターフェイスを使用します。
  • ビジネス ロジック: データ アクセスからのインターフェイスを使用します。
  • データ アクセス: 同じままです。

私の質問は、Web UI とビジネス ロジックで Ninject を構成して、目的を達成するにはどうすればよいですか? 現時点での私のソースコードは次のとおりです。

データ アクセス層:

インターフェイス IHotelRepository.cs

public interface IHotelRepository
{
    IQueryable<Hotel> Hotels { get; }
}

具象クラス HotelRepository.cs

public class HotelRepository : IHotelRepository
{
    private HotelDbEntities context = new HotelDbEntities();

    public IQueryable<Hotel> Hotels { get { return context.Hotels; } }
}

Web UI レイヤー:

NinjectControllerFactory.cs

public class NinjectControllerFactory : DefaultControllerFactory
{
    private IKernel ninjectKernel;

    public NinjectControllerFactory()
    {
        ninjectKernel = new StandardKernel();
        AddBindings();
    }

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        return controllerType == null ? null : (IController) ninjectKernel.Get(controllerType);
    }

    private void AddBindings()
    {
        ninjectKernel.Bind<IHotelRepository>().To<HotelRepository>();
    }
}

Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
    }
}

HotelController.cs

public class HotelController : Controller
{
    private IHotelRepository hotelRepository;

    public HotelController(IHotelRepository repository)
    {
        hotelRepository = repository;
    }

    public ActionResult List()
    {
        return View(hotelRepository.Hotels);
    }

}

ご協力いただきありがとうございます。

4

2 に答える 2