我正在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....
}
但是,有可能创建一个通用的存储库(或存储库接口)来继承我的所有存储库并只注入一个泛型类吗?
答案 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;
}