JackYumCha / QA

Question and Answer
0 stars 0 forks source link

Questions of 2018-05-06 course (SeekKeywords) #10

Open graceansean opened 6 years ago

graceansean commented 6 years ago
  1. 在appsetting里,我怎么能保证所有要定义赋值的参数都已经包含在appsetting里面了呢?或者说appsetting一般用来给哪些参数赋值呢?

  2. 能稍微再讲讲autofac吗?我查了一下网页,大概知道它是用于dependency injection。但是对于它的一般用法和好处还是没搞得很明白。还有register/registerInstance/registertype的用法,什么时候用哪个?

  3. 我看到ArangoConnection.cs只调用了ArangoDB.Client,但是没看到它调用ArangoDB.Client.Jack?

JackYumCha commented 6 years ago

1、appsetting是自己定义如何读取的。你可以看到这里面有:

https://github.com/JackYumCha/SeekKeywords/blob/master/SeekAPI/JobModel/AutoFac/AutoFacContainer.cs

Configuration.GetSection(nameof(ArangoOptions)).Get<ArangoOptions>()

2、dependency injection是一个design pattern,具体好处如果你编程经验不多,可能不太容易理解。它主要是更便于做功能的模块化和分离。你可以考虑一下如果没有dependency inject,做同样的事情要写什么样的代码。比如当你的WEB API需要访问数据库时,还需要知道是谁登录了,dependency injection可以直接通过httpcontext的注入来获取当前访问的cookie或者session数据,从而直接生成用户信息的object,这个用户信息也可以直接Inject到你的WEB API当中,而不用显式地在web api当中构造这个用户信息Object。这样就把功能模块用简单的原则分开了,提高了代码的模块化程度、可读性、可维护性等等。而如果用静态类,虽然也能解决,但是你就要显式地提供httpcontext给静态方法去生成用户信息,而不是让生成用户信息的模块自己管理需要的依赖项。这样导致的一个最简单的差别就是,你要为每个调用的模块显式提供它的依赖项,而这个模块的设计变动如果导致依赖项的变化,你又要对其他所有调用它的代码做修改。一般常用的是RegisterType和RegisterInstance。Instance主要是单实例的类型,比如database connection(如果你不是给每个用户配置一个数据库连接的话)。RegisterType是注册一个类,如果这个类的构造函数当中的依赖项都已经被注册话,那么它就可以被autofac自动构造了。

同样在Angular当中,你可以看到Angular本身也是dependency injection。Angular所有component的构造函数当中声明的类型都是自动注入的。

从语言层面,JavaScript的import和npm也可以算是程序集之间的一种dependency injection。JavaScript跟.NET和Java不一样,它不会先加载依赖项,而是运行时根据你入口文件声明的import去加载js文件。一个文件引用了npm的library(node_modules文件夹),然而这个library可能自带自己的npm依赖项(node_modules文件夹),它当中同样的名字可能指向的是不同版本的文件。而这种行为在.Net和Java当中一般是不存在的,一般要放在两个不同的app domain当中去实现。

3、因为namespace仍然是ArangoDB.Client。我自己改的ArangoDB.Client.Jack只是修改了NewtonSoft.Json的依赖版本,没有改命名空间。程序集名字和命名空间是两回事。你甚至可以在你自己写的C#代码当中声明System命名空间,然后即可以添加System命名空间的类型。如果导致了命名冲突,你需要用using something = A.B或者在.proj文件当中设置alias等方法解决这个冲突。具体你可以自己搜一下,一般情况下是用不到的。