面试问题
一:介绍下设计模式,比如依赖倒置、开闭、迪米特法则等几大设计原则
《依赖倒置》???本来由我依赖你变成我依赖第三方接口,面向接口编程。这就是依赖倒置了。
《开放-封闭原则》函数、某模块 开放扩展-封闭内部修改。指出表明:应当多用接口抽象类或虚方法,以便于后期扩展子类和复写虚方法,而不是修改已有代码,代码优美,便于维护,也可以用装饰者模式实现不修改老代码而扩展其功能。
《迪米特法则》也叫最少知道原则。只与最直接的朋友通信,比如注册功能我只需要调用你这个类提供的注册函数并且提供账号密码就OK了,至于密码怎么处理需要调用什么类来加密我都不关心,一个类对自己依赖的类知道的越少越好,尽量降低减少类之间的耦合。
《单一职责原则》一个类或者是模块概括的功能,职责应该是单一的。否则就会耦合到一起。不利于维护。
《接口隔离原则》上端客户端不应该依赖它不需要的接口,要用什么接口,就建立单一的接口,不应建立臃肿庞大的总接口,而应该尽量细化,方法尽量少点。
《里式替换原则》所有的子类一定能够要替代父类,反过来肯定不行,这样能提高扩展性,提高代码重用性,缺点:继承是侵入性的,子类能够拥有父类所有方法属性,增加耦合,父类的变量方法改了,需要考虑子类的修改。
二:Unity是怎么使用的,流程介绍一下。
《c#代码的Unity容器提供的RegisterType方法传入接口与子类注册》
《配置文件配置所有的注册映射,》
1.通过自己定义的配置文件路径来打开获取到Unity配置文件的配置节点,强制转换类型然后用UnityConfigurationSection类获取
2.section.Configure(container容器,"配置文件容器名称") //用Unity提供的这个方法传入容器对象和配置文件设置对应的容器名称来注册接口,具体子类,注册AOP配置
《在Global.asax全局初始化Application_Start方法里一次性循环遍历注册业务逻辑层目录下的所有接口与子类》
最后Resolve<T>();获取需要的实现类
《直接在控制器全局声明接口变量resolve获取》
《通过控制器的构造函数注入直接获取到实现类》控制器的Unity构造注入在Global里重写控制器工厂,设置指定的我复写的控制器工厂
三:介绍下多线程是在哪里使用的。线程之间怎么通信。比如信号灯
答:Windows定时服务,或者同时需求量多的地方,接收到的压缩包,需要压缩,对视频进行截图,压缩处理。或者是处理队列任务的地方,
缓存用在什么地方,设置时间是?可以用线程一直去查是否有更新,有的话就直接更新缓存数据,如果是服务里运行的线程那可以发起通知到ui主程序去更新缓存。还有就是看使用场景设置时间。也可以在启动程序的时候开启一个线程去读取数据源(好像是硬盘上固化,RadisBase类提供有Save方法可以保存数据DB文件到硬盘。根本还是MSSQL,Radis存的结果数据有可能也会存在MSSQL)把数据转移到Radis里面去。
四:介绍下反射是怎么操作的,在哪些地方使用。
答:反射可以动态反射出实例类、获取他方法,属性,进行操作。IoC就是通过反射的原理操作的,我自己也可以写,就是通过配置文件配置的命名空间、类去动态的反射出这个类的实例。作用就是解耦,没有那么多关联,更灵活。在查询的时候也可以用在动态拼接表名、字段上,利用泛型创建新对象出来并赋值。
动态根据某些特征创建需要的对象类,可以提高代码复用率,简化代码结构,利于维护,如果使用次数过多也可以将其缓存。
五:前端是怎样操作的,比如数据绑定。或者用的什么插件
六:zdy count与count()区别是什么?
七:zdy引用类型与值类型的区别是什么?
八:zdy网站初始化Global.asax文件的MvcApplication类的Application_Start()初始化方法里可以做的扩展设置有哪些?
《继承HandleErrorAttribute复写OnException方法》可切入异常处理检测代码。
答:1.《继承AuthorizeAttribute类 复写OnAuthorization()》第一个执行可切入检测权限等代码。
2.《继承HandleErrorAttribute类 复写OnException()进行异常拦截和处理》
3.继承ActionFilterAttribute类
《复写OnActionExecuting()在执行方法前执行,可计时》
4.《复写OnActionExecuted()在执行方法后执行,可计时》
5.《复写OnResultExecuting()在输出结果前执行,》
6.《复写OnResultExecuted()在输出结果视图后执行,》
九:zdy介绍下Nhibernte。怎么使用的?流程是?
1.《NhibernateBase类的Get函数根据传入的conn数据库昵称到web.config获取到相应的数据库配置文件地址》
2.《然后根据配置文件路径获取到Nhibernate提供的Configuration配置实例类》
3.《通过config实例类获取到ISessionFactory工厂》
4.《通过session工厂类.OpenSession()方法打开获取Nhibernate的Session》
5.《再判断获取到的Session.Connection是SQL还是Oracle什么数据库New/新建相应的数Nhibernate数据库连接仓储层DAL,里面封装有各种定义泛型增删改查的方法。调用即可》
答:web.config里配置nhibernate_pool连接池,分别以key-value对应相应的名称、数据库的xml配置(一般就是sql与orcal或者sql不同的数据库) 控制器通过Unity获取到业务逻辑层后,在业务逻辑层有定义构造函数以便能区分
十:zdy你们日志是怎么记录的?怎么检测程序运行情况?比如运行时长
答:可以继承Unity提供的IInterceptionBehavior接口实现Invoke方法处理方法执行前后操作、异常。或者继承MVC提供的HandleErrorAttribute类重写OnException方法
常用的《在global.asax全局初始化函数Application_start函数里注册Filter过滤器的地方添加自定义的异常Filter扩展重写OnException方法,可以获取异常并处理,也可以判断请求头是否ajax来做JsonResult()或者ViewRsult()返回处理》
《利用UnityAOP切入异常检测代码,可以利用特性filter进行AOP切入检测代码,一般在unity配置文件里配置AOP切入》
十一:zdy介绍下委托?zhi
答:接口定义行为,只能申明方法体,都是抽象的。继承了就必须要实现。接口类可以多个继承,抽象类的继承只是唯一的。
抽象类举例: 定义动物可以用抽象类,猴子类,猫类,狗类,就可以继承动物类。
接口举例 :定义动物的行为,比如中间有相似的方法,但是它们本身又不能抽象成一个事物。就定义一个接口来存放共有的方法。
十六:webapi与webservice区别。
答:webapi用的http协议,webservice用的是soap协议,
依赖:我要调用你这个类里的方法,所以我依赖你。
依赖倒置:针对接口编程!我现在不依赖你这个具体类了,我依赖抽象、接口。上层和下层都去依赖抽象。这个就是依赖倒置了
控制反转(IoC):IoC是Inversion of Control的缩写,是说对象的控制权进行转移,转移到第三方,比如交给IoC容器,它就是一个创建工厂,你要什么对象,它就给你什么对象,
有了IoC容器,依赖关系就变了,原先的依赖关系就没有了,他们都依赖IoC,通过IoC容器来建立他们的关系。
依赖倒置减少了具类的依赖,接口是稳定的,如果以后有修改也不影响,只需要修改具体的类或者配置文件对应的接口与具类的映射。这个就是控制反转,具体对象的控制权交给了配置文件。
依赖注入(DI):DI是Dependency Injection缩写,它提出了“什么东西的控制权被反转了,被转移了?”它也给出了答案:“依赖对象的创建获得被反转。”
所谓依赖注入,就是由IoC容器在运行期间,动态的将某种依赖关系注入到对象中。可以是属性、方法、构造函数注入