问题描述
使用的是Ninject。问题:1.在实际项目中肯定有很多接口、那么都在IOCNinjectModule类里面绑定注册、但是我看一些人放出的代码也使用IOC容器的、却并没有类似的。也有很多接口为了使用依赖注入都用了一些IOC容器、但是我就是看到有类似的绑定注册的。2.当一个接口有多个实现的时候在IOCNinjectModule类中进行绑定那么:IDALdal=ker.Get<IDAL>();就要改成具体的实现类:IDALdal=ker.Get<Sqlserver>();如果不想让具体实现类出现那么是不是就要定义多个IOCNinjectModule类、里面接口的实现只能有一个这样绑定、只是在使用的时候:IKernelker=newStandardKernel(newIOCNinjectModule());这句换成:IKernelker=newStandardKernel(new具体的绑定注册模块());
解决方案
解决方案二:
不要胡乱抽象,不要再一个专业开发者的程序中胡乱使用“注入”的东西。你先要知道正规的代码怎么写,再纠结注入。
解决方案三:
1.IoC容器为了方便注册,一般都会提供以一定的约定规则批量/自动注册的功能,比如把一个程序集中所有的类都注册为其接口的实现。对于Ninject,可以说就是绑定所有具体类和其实现的接口。LZ看到的代码要不然就是使用了一些批量/自动注册的功能,要不然就是还没找到注册的地方。如果注册的工作不是太多,并且接口及其实现都是编译时已知的,那么最好使用显式的绑定代码。如果需要的绑定非常多,或者比如有插件/模块系统,接口的实现在运行时才能确定,那可以使用IoC容器的批量/自动注册的功能,对于Ninject,就是其扩展。2.接口有多个实现,并且实现具有互斥性,不能够同时使用时,有两种方案,对于LZ的例子:一是使用参数传递给自己的Ninjectmodule。比如在IOCNinjectModule里面定义一个属性,用来指示绑定哪种实现,构造module的时候通过配置系统获取配置,确定用哪种数据库,设置好其属性。在Load中判断这个属性来绑定不同的实现。二是使用命名的绑定,这样的话就需要获取的时候指定名字,就能够获得对应的实现了。IoC框架一般都有很多种选择实现的策略,这个肯定是能满足绝大部分需求的,主要还是看具体用途是什么。另外,Ninject的module一般不是LZ那样按照不同的实现来使用不同的module的,而是根据功能划分的。
解决方案四:
LZ你的写法怎么感觉这么诡异,虽然好久没看ninject了,但一般IOC容器都有个container的,然后统一用一个container或者几个实例化的container进行绑定设置