0

我正在使用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....
        }   

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

4

2 回答 2

0

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

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

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

protected ICacheRepository<MockDataSetEnum> LocalCache;

public PlayAreaController(ICacheRepository<MockDataSetEnum> LocalCache)
{
    this.LocalCache = LocalCache;
}
于 2015-04-19T07:16:25.480 回答
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
            }

这样您就可以实现约定优于配置,并且您将避免一个一个地进行注册,它可能是其他方式,但这种策略可以应用于您想要使用的任何容器。

于 2014-11-26T15:33:28.927 回答