在構思完系統思維腦圖後,小墨回到家中,便摩拳擦掌開始了開發工作。要想迅速完成系統開發,前期系統設計和準備尤其重要,因為小墨做過太多大大小小的業務系統,準備工作也是十分順利。 系統結構 整個系統工程結構如上,基於傳統的三層架構模式(不太懂的快去惡補一下) Web: 基於MVC工程模板搭建,系統模型,視 ...
在構思完系統思維腦圖後,小墨回到家中,便摩拳擦掌開始了開發工作。要想迅速完成系統開發,前期系統設計和準備尤其重要,因為小墨做過太多大大小小的業務系統,準備工作也是十分順利。
系統結構
整個系統工程結構如上,基於傳統的三層架構模式(不太懂的快去惡補一下)
- Web: 基於MVC工程模板搭建,系統模型,視圖,控制器
- Service: 業務
- Repository: 持久化層,集成EntityFramework
- Tracking:日誌組件集成Log4net
- CommonUtils:公共工具,提供加密解密/序列化/Excel處理,提供Castle Ioc管理
話不多說,直接上乾貨
集成Log4net
雖說李老闆的芒果業務系統是如此的簡單,可一向有著強迫症的小墨仍然有板有眼的規劃系統的各個架構功能,做事盡善盡美是小墨的一貫作風。日誌能省嗎,當然不能!以下集成Log4net.
Nuget下載
這裡直接右鍵解決方案Nuget中搜索Log4net,安裝最新版5.2.7
日誌配置文件
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<log4net debug="true">
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs/Log" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<staticLogFileName value="false" />
<datePattern value="_yyyy.MM.dd.'log'" />
<maxSizeRollBackups value="20" />
<maximumFileSize value="5MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="DUBEG" />
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
</configuration>
幾點必要說明:
<file value="Logs/Log" /> 配置logs列印路徑
<staticLogFileName value="false" /> 配置Log文件名非靜態,因為小墨想每天生成一個Log文件
<datePattern value="_yyyy.MM.dd.'log'" /> 日誌文件格式 Log_2020.03.20.log
Global.asax.cs里配置Log啟動
public class LoggerFactory
{
public static void Config()
{
var baseDir = AppDomain.CurrentDomain.BaseDirectory;
var filePath = Path.Combine(baseDir, "Config\\Log4net.config");
var fileInfo = new FileInfo(filePath);
log4net.Config.XmlConfigurator.Configure(fileInfo);
}
}
然後就可以優雅的使用日誌啦!
//聲明
ILog logger = log4net.LogManager.GetLogger(typeof(MvcApplication));
//使用
logger.Info("大青芒管理系統已啟動.");
這裡可以再將ILog包裝下,支持參數化列印日誌,可以在優化下。
集成AutoMapper
首先說明下整個系統的Model,Dto , Entity,根據業務需要定義也是比較簡單,主要分為用戶(代理表),訂單表,所以就有
UserModel/UserInfo/UserEntity
OrderModel/OrdeDto/OrderEntity
這裡不可避免的用到各個對象的互相轉化,當然我們一定不會挨個欄位賦值的,很弱,這裡我們使用用AutoMapper,因為之後他廣泛應用在我們之後的業務中。
Nuget引入AutoMapper
AutoMapper配置
這裡因為,我的Dto與Entity都是簡單類型,而且類型都是一致的,所以可以直接Map,但是一般在稍微複雜的業務中,Dto中經常會嵌套其他Dto,或者欄位類型也是不匹配的,我們主要使用AutoMapper的以下兩個方法去做轉換,這裡我不做舉例了。
ForMember
ResolveUsing
Global.asax.cs系統啟動時,啟動Map配置。這裡在Service層引入一個AutoMapperInit類,過渡一下調用Repository的Initialize方法,是為了不想再Service層引入AutoMapper包,所有Dto與Entity的轉換在Repository里處理
AutoMapperInit.Init();
使用AutoMapper
感謝閱讀!
本文由博客群發一文多發等運營工具平臺 OpenWrite 發佈