0%

WebApi项目的依赖注入需要使用System.Web.Http.Dependencies里的IDependencyResolver来实现,和Mvc的IDependencyResolver是不一样的,所以需要实现的Resolver不一样。虽然了解了大概怎么写,但是始终没能让自己重写的Resolver启动,并且看别人写好的还解决了其他的一些注入问题。于是,决定还是用Ninject下面fork的remogloor/Ninject.Web.WebApi,免得浪费时间折腾轮子了。

Mvc的配置

环境

WebApi2.Net Framework 4.5VS2015

使用方法

  1. 添加引用,使用NuGet安装以下两个包
  • Ninject
  • Ninject.Web.WebApi

查看引用会发现附赠了 Ninject.Web.CommonNinject.Web.Common.WebHostNinject.Web.WebApi.WebHost 三个包。

  1. 然后修改在App_Start下NinjectWebCommonRegisterServices(),在里面后面加上自己的注入bind,如:
    1
    2
    3
    4
    5
    private static void RegisterServices(IKernel kernel)
    {
    kernel.Load(Assembly.GetExecutingAssembly());
    kernel.Bind<IUserRepository>().To<UserRepository>();
    }

以上。使用起来很简单。就是封了一层,有些东西需要自己看源码理解了。

最近项目正式测试,做的工具使用中遇到了问题,静态变量到底怎么用。

在希望变量可以多次重复使用的时候,会想用静态变量来降低内存消耗,但是这时候也会引入多进程并发使用时的问题。如果使用了静态变量,并且这个变量在每一个进程都应该不一样的话,这样的变量也不是静态的,会出现变量内容覆盖的问题。

在Web多会话的情况下,静态变量是使用的同一内存地址,所以,在考虑在单线程多个类中重用变量时,还是用传参之类的地址引用吧。

如果是完全静态不会变(静态字符串什么的),或者所有进程共享的变量(统计访问量什么的),可以使用静态变量来处理,降低内存消耗。

以前很少经历并发的情况,对相关的思维还是不清晰,以后需要多加留意。以前明明都学过,但是都没注意过。(╯‵□′)╯︵┻━┻

javac “编码GBK的不可映射字符”

使用javac -encoding UTF-8 XXX.java,或把文件编码改为ANSI

记录

LeetCode的笔记以后就直接写在对应的代码文件夹下面README.md里,毕竟有些题简单还写post太麻烦了,找起来也不方便

话说我这么写随笔好像也没嫌弃麻烦呢= =||,嘛,还是看情况吧,大不了回头再迁移过来嘛

在进行一些计算时,可以使用位运算代替,从而提升代码执行速度。

以下为常用提升效率的操作

求奇偶数:

奇数(Odd):11 & 1 = 1
偶数(Even):24 & 1 = 0

乘2的幂

1 * 2: 1 << 1 = 2
1 * 4: 1 << 2 = 4

除2的幂

8 / 2: 8 >> 1 = 4
8 / 4: 8 >> 2 = 2

注:上面算式里的*号,在Markdown里用来做 斜体加粗 什么的,直接用记着转义( * ),还有其他特殊符号什么的以后写的时候要注意一下。

把博客里的代码块高亮整理了一下,没高亮看着真是不好看。(ー̀дー́) 改完了感觉好多了,嗯( • ̀ω•́ )✧。

最近还是很迷茫(=_=),不知道有时间的时候,该拿什么充实自己的技术栈,web开发相关的东西,在公司这环境实在不好再往更复杂的方向发展,即使自己去学了Redis、RabbitMQ也无处可用。(╯︵╰)

现在机器学习很火,但是要学习的东西太多了,不能盲目的去追,有在看数据挖掘的东西,先学着,至少概念和一些技术词汇了解了,再看情况是否一步步的加深了解。( ̄. ̄)

卖卖萌调整一下心情( ̄ω ̄)

还要准备科目一,事情还是很多的(´・_・`)路还很长,时间很快,接着走吧

问题

打包的人反馈EF DBFirst的数据库连接配置里面的&quot(“"”),处理不好,沟通起来又不在一个地方,很麻烦,连接配置也的确不太好看,于是搜了下,看到了可以自定义。

版本

Entity Framework v6.1.3

解决方法

  1. 写个获取连接的类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    using System.Configuration;

    namespace Utils
    {
    public class EFConfig
    {
    public static string DataBaseConnectionString()
    {
    string DataBaseConnection = ConfigurationManager.AppSettings["Connection"].ToString();
    return ConnectionString(DataBaseConnection);
    }

    public static string ConnectionString(string DataBaseConnection)
    {
    return "metadata=res://*/EFData.csdl|res://*/EFData.ssdl|res://*/EFData.msl;provider=System.Data.SqlClient;provider connection string =\""
    + DataBaseConnection + "persist security info=True;multipleactiveresultsets=True;application name=EntityFramework\"";
    }
    }
    }
  2. 重写一下edmx->*.Context.tt->*.Context.cs的构造函数,可以直接修改*.Context.tt文件内的模板,避免下次更新数据库时,代码需要重新修改,搜索base即可,修改后面的"name=xxx"为你获取自定义连接的方法。

    1
    2
    3
    4
    public EFDbContext()
    : base(Utils.EFConfig.DataBaseConnectionString())
    {
    }
  3. Web.config<appSettings>节点配置,删除不使用了的<connectionStrings>节点

    1
    2
    3
    <appSettings>
    <add key="Connection" value="data source=127.0.0.1;initial catalog=DBName;user id=User;password=Pwd;" />
    </appSettings>

小结

其实这主要是构造函数本来的方法就支持直接配置连接字符串

EF的构造函数

需求

做出多组radio组,来作为选择条件的UI组件,比select更方便好看。

问题

  1. 使用了bootstrapvue,两者存在冲突,将bootstrap的js去掉。除了要实现Vueradio组件外,因为bootstrap的js删除了,所以radio选中的效果没有了,需要自己用Vue来实现绑定点击效果。(不换掉bootstrap的js的话Vue的radio组件事件绑定就会和冲突,进而没反应)
  2. 自定义组件的v-model,没能实现出想要的效果。待实验。

解决方法

1. bootstrapvue冲突

本来想换成bootstrap-vue的js来用,发现radio的效果不一样了,最后还是要自己写选中效果,索性就把bootstrap的js去掉了,只用个css。

2. Vueradio组件相关实现

demo的js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// radio组件
var temp = '<label class="btn btn-default" :class="{active:checked}" :for="id">{{ label }}'
+ '<input :name="name" :id="id" type="radio" :value="value" :checked.sync="checked" v-on:click="update" ref="input"></label>';
Vue.component('radio-tag', {
template: temp,
props: {
id: String,
name: String,
label: String,
value: String,
checked: Boolean // 用来绑定初始值
},
methods: {
update() {
console.log('update');
// ref获取dom
if (this.$refs['input'].checked) {
this.$emit('update', this.value);
}
}
}
});

var app = new Vue({
el: '#condition',
data: {
schools: [{ 'id': 'a', 'name': 'a校' },
{ 'id': 'b', 'name': 'b校' }],
grades: [{ 'id': 'a1', 'name': '初一' },
{ 'id': 'a2', 'name': '初二' },
{ 'id': 'a3', 'name': '初三' }],
school: 'a',
grade: 'a1'
},
methods: {
updateGrades(value) { // 回调函数
this.school = value
},
updateClazzes(value) {
this.grade = value
}
}
});

demo页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div id="condition" class="row clearfix ">
<div class="col-md-12 column">
<form role="form" class="form-horizontal">
<div class="form-group form-inline">
<label for="School" class="col-md-4 control-label">学校</label>
<div class="btn-group" data-toggle="buttons">
<radio-tag v-for="item in schools" :id="item.id" :name="item.id" :label="item.name" :value="item.id" :checked="school === item.id" v-on:update="updateGrades"></radio-tag>
</div>
<span>{{school}}</span>
</div>
<div class="form-group form-inline">
<label for="Grade" class="col-md-4 control-label">年级</label>
<div class="btn-group" data-toggle="buttons">
<radio-tag v-for="item in grades" :id="item.id" :name="item.id" :label="item.name" :value="item.id" :checked="grade === item.id" v-on:update="updateClazzes"></radio-tag>
</div>
<span>{{grade}}</span>
</div>
</form>
</div>
</div>
</div>

<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue"></script>
<script type="text/javascript" src="index.js"></script>
</body>
</html>

小结

  1. vue的语法缩写
  • v-bind缩写:,例:v-bind:id="id"->:id="id"
  • v-on缩写@,例:v-on:click="update"->@click="update"

    .net Razor页面中@冲突,可以使用@@,或者就不要缩写

  1. vue中class绑定
  • :class="{active:isActive}",这个是官方例子
  • :class="{active:(model==0?true:false)}",表达式使用
  1. 父子组件传值
  • props属性用来父往子传值
  • $emit()方法用来子往父传值

前言

数组的合并拆分,基本就是利用数组的复制方法来实现

C#里面使用lambda表达式很方便,数组的各种操作使用lambda就很简洁,但是效率也是自然不如其他的函数了

数组合并(复制)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
int[] a = new int[] { 1, 2, 3, 4, 5 };
int[] b = new int[] { 6, 7, 8, 9 };
int[] c = new int[](a.Length + b.Length);

// lambda表达式 Concat 方法
int[] c = a.Concat(b).ToArray();

/* Array.Copy 支持所有类型数组,支持装拆箱
public static void Copy(
Array sourceArray,
int sourceIndex,
Array destinationArray,
int destinationIndex,
int length
)
*/
Array.Copy(a, 0, c, 0, a.Length);
Array.Copy(b, 0, c, a.Length, b);

// Array.ConstrainedCopy 和 Array.Copy 差不多,更严格,不支持装拆箱

/* Buffer.BlockCopy 只支持基元类型
sbyte / byte / short / ushort / int / uint / long / ulong / char / float / double / bool

public static void BlockCopy (
Array src,
int srcOffset,
Array dst,
int dstOffset,
int count
)
*/
Buffer.BlockCopy(a, 0, c, 0, a.Length);
Buffer.BlockCopy(b, 0, c, a.Length, b);

数据量小的情况下,没有太大差别,大量数据时速度比较如下

1
Buffer.BlockCopy > Array.ConstrainedCopy > Array.Copy > Concat

数组拆分

除了lambda表达式基本,就是使用复制方法,复制子数组到新数组了,如:

1
2
3
int[] a = new int[] { 1, 2, 3, 4, 5 };
int[] b = new int[](3);
Array.Copy(a, 0, b, 0, 3);

字符串数组 以指定间隔符 拼接成字符串

1
2
string[] a = new string[] {"1", "2"};
string s = string.Join(", ", a); // 1, 2

字符串 以指定间隔符 分割成字符串数组

1
2
3
4
5
6
7
8
9
// 单字符分割
string s = "a|b|c|";
string[] a = s.Split('|'); // {"a", "b", "c", ""}

// 多字符分割
string[] a = s.Split(new char[2] {'&','|'});

// 字符串分割
string[] a = Regex.Split(s,"ab",RegexOptions.IgnoreCase);