Asp.net mvc 3 使用通用服务简化NinjectWebCommon注册服务

Asp.net mvc 3 使用通用服务简化NinjectWebCommon注册服务,asp.net-mvc-3,ninject,ninject.web.mvc,ninject.web,Asp.net Mvc 3,Ninject,Ninject.web.mvc,Ninject.web,我正在将Ninject.MVC3用于我的DI 我有超过25个依赖项要注入,但我的RegisterService现在有25行代码,类似于: private static void RegisterServices(IKernel kernel) { kernel.Bind<IClientRepository>().To<ClienteRepository>(); kernel.Bind<IRegionRe

我正在将Ninject.MVC3用于我的DI

我有超过25个依赖项要注入,但我的RegisterService现在有25行代码,类似于:

private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<IClientRepository>().To<ClienteRepository>();
            kernel.Bind<IRegionRepository>().To<RegionRepository>();
            kernel.Bind<IRequestTypeRepository>().To<SolicitudTipoRepository>();
            kernel.Bind<OrdenRepository>().To<OrdenRepository>();
            //Some other references....
        }   

但是,是否可以创建一个通用存储库或存储库接口来继承所有我的repo并只注入一个通用类?

一种方法是通过接口和使用反射的实现查询程序集,您必须定义要扫描的名称空间,例如:

string[] namespaces = { "namespace1", "namespace2", "namespace3", "namespace4" };
//scanning assemblies
List<Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(x => x.FullName.Contains("mybasenamespace")).ToList();
            foreach (var reg in assemblies.Select(assembly => (from type in assembly.GetExportedTypes()
                                                               where !type.IsInterface && type.GetInterfaces().Any() && namespaces.Any(n => type.Namespace != null && type.Namespace.Contains(n))
                                                               select new
                                                               {
                                                                   Service = type.GetInterfaces().SingleOrDefault(t => t.Name.Contains(type.Name)),
                                                                   Implementation = type
                                                               })).SelectMany(registrations => registrations.Where(reg => reg.Service != null)))
            {
                //do your registrations by type here kernel.bind etc, etc
            }

通过这种方式,您可以实现约定优于配置,并且可以避免逐个进行注册,这可以是其他方式,但此策略可以应用于您想要使用的任何容器。

这允许您使用通用存储库模式

kernel.Bind(typeof(ICacheRepository<>)).To(typeof(ICacheRepository<>)).InRequestScope();  
在控制器内部,您需要指定确切的泛型类型,例如

protected ICacheRepository<MockDataSetEnum> LocalCache;

public PlayAreaController(ICacheRepository<MockDataSetEnum> LocalCache)
{
    this.LocalCache = LocalCache;
}

我刚刚读了一篇关于getAssemblys方法的文章:但是这些代码应该在项目启动时运行,对吗?我应该在哪里创建方法,在App_Start目录或my Global.asax中?建议您在引导应用程序时创建方法,如果您正在设置容器的依赖项,则可以是Global asax或任何其他位置