首页 文章

三层asp.net mvc应用程序中的依赖注入

提问于
浏览
14

我有一个3层应用程序,图层是:

  • Web:表示层(ASP.NET MVC) - >只看到BLL

  • BLL:业务逻辑层 - >只能看到DAL

  • DAL:数据访问层

所以 Web 层对我的 DAL 层一无所知 . 我在 DAL 中有存储库接口和具体类,它们在业务逻辑类的 BLL 层中使用 . 问题是,为了解耦 DALBLL ,如何设置Ninject以将我的存储库实现注入 BLL 层?

同样的问题是 Web 层和 BLL 层,我在 BLL 上有接口和实现,我在 Web 层中使用它们,我应该如何为此设置Niject?

3 回答

  • 7

    我们的想法是为您的DAL和BLL定义接口 . 然后,您将此类接口的实例作为构造函数参数 . 例

    interface IDatabase
    {
        // Methods here
    }
    

    你的BLL课程:

    public class Bll
    {
        IDatabase _db;
        public Bll(IDatabase db)
        {
            _db = db;
        }
    
        public void SomeMethod()
        {
            // Use db here
        }
    }
    

    然后在组合根(在Web应用程序中)中使用内核来配置这些依赖项:

    kernel.Bind<IDatabase>().To<ConcreteDatabase();
    

    从控制器到BLL需要相同的东西,但它的工作方式相同 .

    除此之外,我认为你的依赖关系没有正确设置 . 通常,您不希望这些垂直依赖项 . 你应该瞄准更平坦的等级制度 . 我写了一篇关于此的博文:http://www.kenneth-truyers.net/2013/05/12/the-n-layer-myth-and-basic-dependency-injection/

    在我的博客文章中,我解释了这种层次结构的问题是什么以及如何避免它 . 除此之外,它描述了你的问题:ASP.NET MVC,BLL,DLL和Ninject将它们联系在一起 .

  • 1

    我们在企业级应用程序中也遇到了这个问题 . 如何使用业务和数据层中的类加载依赖项注入引擎,而无需从Web应用程序创建对业务和数据层的硬引用 . 我们最初玩了一些设计并提出了这个非常成功的设计,到目前为止我们已经为我们工作了18个月并且表现非常好 .

    在Web应用程序的ninjectwebcommon文件中,使用反射来访问业务和数据层,以便您可以加载所需的一切

    像这样:

    System.Reflection.Assembly assembly;
    
            assembly = System.Reflection.Assembly.Load("our.biztier");
            kernel.Load(assembly);
    
            assembly = System.Reflection.Assembly.Load("our.datatier");
            kernel.Load(assembly);
    

    Ninjects“Load”方法查找程序集中继承ninject类“NinjectModule”的任何类,然后调用它将所有内容加载到内核中 .

    因此,我们的业务和数据层都包含一个简单的注入类,我们用它来加载所有内容 .

    public class InjectionModuleBiz : NinjectModule
    {
    
    
        public override void Load()
        {
            Kernel.Bind<ICustomerBiz>().To<CustomerBiz>().InRequestScope();
            Kernel.Bind<IEmployeeBiz>().To<EmployeeBiz>().InRequestScope();
        }
    }
    

    我们在数据层中有另一个injectModule类

    public class InjectionModuleData : NinjectModule
    {
    
    
        public override void Load()
        {
            Kernel.Bind<ICustomerData>().To<CustomerData>().InRequestScope();
            Kernel.Bind<IEmployeeData>().To<EmployeeData>().InRequestScope();
        }
    }
    

    最终结果是我们的所有业务层和数据层类都加载到我们的ioc容器中,并且可以在任何地方注入 .

    希望有所帮助 .

  • 5

    我同意在使用Visual Studio在N层应用程序中使用依赖注入时会有很多困惑 .

    主要是因为在Visual Studio中,我们将层构建为解决方案中的不同项目,并通过引用项目或DLL来添加依赖项 . 这与DI和Composition Root概念的原理完全不同 .

    基本问题是我们注入的依赖项是什么?

    业务逻辑或存储库?

    如果它是存储库,是的,你是对的,Web层不需要知道它 . BLL根据特定条件选择存储库 .

    如果我们有完全隔离的应用程序,我们需要在两个级别设置DI .

    您的Web应用程序需要设置ninject来创建BLL组件 . BLL应用程序将设置ninject以创建一组特定的逻辑和存储库类 .

相关问题