Ninject和包装服务,基础设施和数据层(Ninject and packaging servic

2019-10-18 17:59发布

我ninject一个巨大的风扇。 然而迄今为止,我只用它的单个应用程序注射。 我现在想打包我服务的基础设施和我所创建的数据层。

基本上我的基础设施层创建存储过程道的,我的服务层需要传递到数据层的合同。 该数据层确实与添加到DAO的参数SP呼叫并返回一个数据集。 所有这一切工作出色。

我用他们三个都基于构造函数的依赖注入,我想和他们一起预包装国际奥委会。 这样,当我在另一个应用程序中使用它们,我没有重新布线的依赖注入的DLL中的类。

每目前我用ninject时间,我电汇了ninject webcommon,做整个应用程序上下。

namespace MyApp.App_Start
{
    using System;
    using System.Web;

    using Microsoft.Web.Infrastructure.DynamicModuleHelper;

    using Ninject;
    using Ninject.Web.Common;

    public static class NinjectWebCommon 
    {
        private static readonly Bootstrapper bootstrapper = new Bootstrapper();

        /// <summary>
        /// Starts the application
        /// </summary>
        public static void Start() 
        {
            DynamicModuleUtility
                .RegisterModule(typeof(OnePerRequestHttpModule));

            DynamicModuleUtility
                .RegisterModule(typeof(NinjectHttpModule));

            bootstrapper.Initialize(CreateKernel);
        }

        /// <summary>
        /// Stops the application.
        /// </summary>
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }

        /// <summary>
        /// Creates the kernel that will manage your application.
        /// </summary>
        /// <returns>The created kernel.</returns>
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            AutoMapper.AutoMapperConfigurator.Configure();

            try
            {
                kernel.Bind<Func<IKernel>>()
                    .ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>()
                    .To<HttpApplicationInitializationHttpModule>();

                RegisterServices(kernel);
                return kernel;
            }
            catch
            {
                kernel.Dispose();
                throw;
            }
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<IQuerySelector>().To<QuerySelector>();
            kernel.Bind<IQueryExecutor>().To<QueryExecutor>();
            kernel.Bind<ISqlParameterPopulationService>()
                .To<SqlParameterPopulationService>();
        }        
    }

我想在我的预包装DLL的开发商不访问一个IOC,然后用户可以拥有他/她自己的IOC,他们会增加他们的所有注射到的。

Answer 1:

这是可行的。

我通常创建一个单独的“CompostionRoot”项目,该项目本身引用了我的中央界面和具体的业务/服务/数据层等,再加入Ninject到它,加入到这个项目中我的MVC /的WebAPI项目的引用,然后最后通过在从Ninject.Web.Common内核RegisterServices功能

using CompositionRoot; 
...
...

private static void RegisterServices(IKernel kernel)
        {
            var cr = new MyExternalComposer(kernel);
            cr.DoBindings();
        }  

现在,这可能不被视为“最佳做法”,但我喜欢这种方法是,我没有依赖关系都从我的MVC项目的具体业务/服务/数据层的实现 - 一切都可以通过接口仅通过引用我的接口来完成在其他解决方案从MVC项目,再加上项目的项目可以重新使用。 这只是一个间接的额外层,我想,我还没有从做这种方式迄今遇到的任何缺点...

希望帮助。



文章来源: Ninject and packaging service, infrastructure and data layers