使用通用服务简化NinjectWebCommon RegisterServices

时间:2014-11-26 15:22:04

标签: 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<IRegionRepository>().To<RegionRepository>();
            kernel.Bind<IRequestTypeRepository>().To<SolicitudTipoRepository>();
            kernel.Bind<OrdenRepository>().To<OrdenRepository>();
            //Some other references....
        }   

但是,有可能创建一个通用的存储库(或存储库接口)来继承我的所有存储库并只注入一个泛型类吗?

2 个答案:

答案 0 :(得分:0)

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

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
            }

您正在实施约定优于配置并且您将避免逐个进行注册,这可能是其他方式,但此策略可应用于您要使用的任何容器。

答案 1 :(得分:0)

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

kernel.Bind(typeof(ICacheRepository<>)).To(typeof(ICacheRepository<>)).InRequestScope();  

在控制器内部,您需要指定确切的泛型类型,例如

protected ICacheRepository<MockDataSetEnum> LocalCache;

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