這周其實突然感覺焦慮有點蔓延。主要是隨便上招聘網站、培訓網站、開發類新聞網,.Net的身影已經越來越少了,並不一定說是要貶低.net,而是這些年他的職業前景確實不太光鮮。一線主流企業的核心場景都不用.net的,或者只是被當成備胎,要不是這兩年微軟的開源政策有所改觀,市場有點動靜,否則連備胎都當不成。 ...
這周其實突然感覺焦慮有點蔓延。主要是隨便上招聘網站、培訓網站、開發類新聞網,.Net的身影已經越來越少了,並不一定說是要貶低.net,而是這些年他的職業前景確實不太光鮮。一線主流企業的核心場景都不用.net的,或者只是被當成備胎,要不是這兩年微軟的開源政策有所改觀,市場有點動靜,否則連備胎都當不成。。。
當然了,話說回來,自己技術不強,不要去怪這怪那,還是繼續我自己的提升之路,打算上半年把MVC+.net core研究一下,下半年把Python也領教下,最終能走到哪裡算哪裡了~
==2019.03.12
1、近期在調用事務方法時,遇到了不回滾的情況,查看半天代碼沒看出問題,後來瞭解了一點原理,spring.net的事務涉及AOP動態代理。
案例A,如果調用UserService.SaveData("第三皇族",21,"dissun"),此時異常會正常觸發回滾,如下:
public class UserService : IUserService
{
public IUserDao UserDao { get; set; }
public IAccountDao AccountDao { get; set; }
[Transaction]
public void SaveData(string name, int age, string accountName)
{
UserDao.Create(name, age);
throw new Exception("我出毛病了。。。");
AccountDao.Create(accountName, name);
}
}
案例B:稍微改動後,如果調用UserService.SaveData("第三皇族",21,"dissun"),並沒有回滾,也就是UserDao.Create正常執行,AccountDao.Create沒有執行。
public class UserService : IUserService
{
public IUserDao UserDao { get; set; }
public IAccountDao AccountDao { get; set; }
public void SaveData(string name, int age, string accountName)
{
SaveData002(name, age, accountName);
}
[Transaction]
public void SaveData002(string name, int age, string accountName)
{
UserDao.Create(name, age);
throw new Exception("我出毛病了。。。");
AccountDao.Create(accountName, name);
}
}
這一次執行失敗的一個變化,就是SaveData方法去掉了Transaction特性,併在內部調用了含有事務特性的SaveData002方法。這個為什麼會導致事務回滾失敗呢?
這就涉及上面說的AOP動態代理。當前端controller調用SaveData方法時,spring.net攔截到方法名,當這個方法被Transaction修飾時,會生成一個UserService 的代理類,然後在執行方法前、後加入了事務,類似下麵的代碼
Proxy.開啟事務();
UserService.SaveData();
Proxy.提交事務();
案例A中,因為AOP攔截到事務特性,動態創建了代理類,調用的是代理類,所以事務添加成功。案例B中,SaveData方法本身沒有添加事務特性,所以調用的目標類本身,SaveData002方法屬於內部調用,也沒有觸發代理類的生成。
這一點需要十分註意。
==2019.03.11
1、List<T>的Select()和Where()方法區別。
Select 是用來獲得不同列的數據,而不是過濾篩選數據,一開始我就混淆了。例如有一個3個欄位的數據集合,可以select 成一個新的兩個欄位的數據集合。例如:
class Program { static void Main(string[] args) { List<TempClass> list = new List<TempClass>(); list.Add(new TempClass("aaaaa", 1, DateTime.Now)); list.Add(new TempClass("aa111", 2, DateTime.Now)); list.Add(new TempClass("aa222", 3, DateTime.Now)); list.Add(new TempClass("bb333", 4, DateTime.Now)); list.Add(new TempClass("cc444", 5, DateTime.Now)); list.Add(new TempClass("bb555", 6, DateTime.Now)); object cctv1 = list.Select(x => x.Name);//獲取一個只有Name的對象集合 object cctv2 = list.Select(x => new { x.Name, x.Age });//獲取一個含有Name、Age的對象集合 object cctv3 = list.Where(x => x.Name.Contains("aa"));//獲取整個集合中包含aa的 object cctv4 = list.Where(x => x.Name.Contains("aa") && x.Age<3);//獲取整個集合中包含aa,並且年齡小於3的 object cctv5 = list.Select(x => x.Name.Contains("aa"));//他可不是篩選出包含“aa”的數據的意思,他會把list中Name這一列全部進行是否包含“aa”校驗,輸出的結果是一個List<bool>集合 int cc = 0; } } public class TempClass { public TempClass(string name,int age,DateTime birthday) { this.Name = name; this.Age = age; this.Birthday = birthday; } public string Name { get; set; } public int Age { get; set; } public DateTime Birthday { get; set; } }
獲取的結果圖。
==2019.03.14
寫了一個關於Redis日誌隊列的專題(https://www.cnblogs.com/dissun/p/10558817.html)