🚫 Ad Blocker Detected

Please disable your AD blocker to continue using this site. Ads help us keep the content free! please press keyboard F5 to refresh page after disabled AD blocker

請關閉廣告攔截器以繼續使用本網站。廣告有助於我們保證內容免費。謝謝! 關閉後請按 F5 刷新頁面

0%

說明

系統模塊存在很多複雜的耦合問題,很適合使用中介者模式來解耦合

在現實中如果組織有一定規模可能構通如下圖那般複雜

如果有一個人或組織負責幫大家協助溝通,就可解決上面複雜問題

這就是我們這次的核心中介者

中介者模式有幾個角色

  • AbstractMediator (抽像中介者):定義中介者和各個同事者之間的通信的介面
  • ConcreteMediator (中介者):知道每個同事物件,實現抽像中介者,負責協調和各個具體的同事的交互關係
  • AbstractColleague (抽象同事者):定義同事者和中介者通信的接口
  • ConcreteColleague (同事者):實現自己的業務,並且實現抽象方法,跟中介者進行通信

中介者模式特點是

Read more »

說明

系統模塊存在很多複雜的耦合問題,很適合使用中介者模式來解耦合

在現實中如果組織有一定規模可能構通如下圖那般複雜

如果有一個人或組織負責幫大家協助溝通,就可解決上面複雜問題

這就是我們這次的核心中介者

中介者模式有幾個角色

  • AbstractMediator (抽像中介者):定義中介者和各個同事者之間的通信的介面
  • ConcreteMediator (中介者):知道每個同事物件,實現抽像中介者,負責協調和各個具體的同事的交互關係
  • AbstractColleague (抽象同事者):定義同事者和中介者通信的接口
  • ConcreteColleague (同事者):實現自己的業務,並且實現抽象方法,跟中介者進行通信

中介者模式特點是

Read more »

介紹RabbitMQ

RabbitMQ是個訊息仲介(broker),主要是利用消息把生產者跟消費者解耦合

在RabbitMQ主要有以下角色

  1. 產生者(producer)
  2. 接收者(consumer)
  3. 佇列(Queue)
  4. 交換器(Exchange)
  5. 訊息(Message)

上面太抽象?  讓我來舉一個簡單點的例子

我們要寄信會把信投進郵筒,信件統一送到郵局,由分配至各個區域郵差去寄送信件

在此可把上面的角色對應在RabbitMQ上

  1. 產生者(producer)= 寄信人
  2. 接收者(consumer) = 收件人
  3. 佇列(Queue)= 郵差
  4. 交換器(Exchange) = 郵筒
  5. 訊息(Message)  = 信件

下面是我畫RabbitMq運作流程圖

Read more »

RabbitMQ是什麼?

RabbitMQ是一個訊息中介軟體 (broker), 他實作​AMQP標準, 特點是消息轉發是非同步並且可靠.

主要用來處理應用程序之間消息的儲存與轉發可讓消費者和生產者解耦合, 消息是基於二進制

因為RabbitMQ Server是用Erlang語言編寫,所以在安裝RabbitMQ Server前須先安裝Erlang環境

安裝完後可到RabbitMq官網下載安裝Server .

以下是常用在CMD使用的使令

  • 開啟RabbitMq Server. 

    rabbitmq-server -detached

  • 查看RabbitMq狀態 

    rabbitmqctl status

  • 查看Queue列表狀態

    rabbitmqctl list_queues

  • 查看交換器(Exchange)

    rabbitmqctl list_exchanges

  • 查看綁定狀態

    rabbitmqctl list_bindings

RabbitMQ Server UI

RabbitMq Server 很貼心也有UI版的控制面板,只需在CMD中輸入這個指令 啟用Server UI套件

rabbitmq-plugins enable rabbitmq_management

Read more »

前言:

為何我會選用Hxeo來當作Blog框架?

有下面幾個原因:

  1. 因為建立於本地端,所以可以更方便離線進行編輯
  2. 使用 Markdown 語法撰寫Blog,更方便、通用、容易上手
  3. 搭配線上CICD工具部署於 Github 上,完全零成本
  4. 中文文件資源多
  5. 支援多樣不同樣板,可隨心所欲切換風格
  6. 開源社群活躍
  7. 基於NodeJs擁有豐富的差件

建立自己的Hexo

安裝 Node.js

首先先安裝 Node.js 官網下載安裝

安裝完後使用CMD

 node -v
npm -v

查看是否安裝成功.

Read more »

Autofac 是個IOC容器  不懂IOC 參考 我之前寫
IOC(控制反轉),DI(依賴注入) 深入淺出~~

小弟之前有一個開源框架【C#】 AOP輕型框架 AwesomeProxy.Net 介紹使用 裡面簡單介紹 AOP核心概念和如何實作!

Autofac 有寫一個 Autofac.Extras.DynamicProxy 把AOP和IOC容器融合的框架

在Autofac使用AOP 需要實現下面幾個步驟

本次範例我們從資料庫中撈取時間資料出來,並使用Thread.Sleep(5000) 作出延遲,判斷時間是否前後一致。

第一步(定義攔截器):

我們撰寫一個快取的攔截器繼承IInterceptor 介面,並實現Intercep方法

其中 IInvocation 參數有許多有用的資料

  • Arguments:傳入方法中的參數
  • InvocationTarget :被代理物件
  • MethodInvocationTarget:被代理物件的呼叫方法資訊
  • Proxy:代理物件
  • Method:代理的呼叫方法資訊
  • ReturnValue:呼叫方法的回傳值

這幾個欄位是我們比較常用的資訊

Read more »

前言:

市面上有許多IoC容器 Ninject,Unity….

雖然容器眾多但要解決的問題和概念是一樣

今天使用Autofac 介紹一下IoC容器

不了解 IoC 概念可參考 我之前寫 IOC(控制反轉),DI(依賴注入) 深入淺出~~

Autofac是一個 Ioc 容器

眼尖的讀者會發現我把Ioc跟容器這兩個字使用兩個不同顏色

原因是Autofac這個框架其實做到兩個概念.

  • IoC(Inversion of Control)
  • 管理物件的容器
Autofac框架幫我們實現可以管理物件生命週期並提供依賴注入相對應的物件中
Read more »

前言:

目的:

如果有兩大類模組是多對多的組合,如本次Smaple Code. Nick和Addidas 包包都有紅、藍、黃….或其他顏色

就可能呈現下面6種組合

  • Nick(紅)
  • Nick(藍)
  • Nick(黃)
  • Addidas(紅)
  • Addidas(藍)
  • Addidas(黃)

如果此建立類別的話 可能情況如下面的UNL圖

類別數量 = 顏色數量 * 包包品牌數量

這樣會有兩個問題

  1. 隨著品牌和顏色增多,包包類別數量急速增長 (X = m*n)個
  2. 顏色我們可看做一個抽象 不應當和包包合在一起
Read more »

前言:

之前有和大家分享使用CASE WHEN 搭配聚合函數實現樞紐分析

但今天如果我們要轉換成行的列希望是動態依照目前資料庫的欄位要處理呢?

我們可以使用Dynamic pivot

``Dynamic pivot 核心概念其實是把我們要使用的pivot SQL`語法動態產生出來

程式碼

CREATE TABLE T(
    userName VARCHAR(100),
    Price int,
    Dt DATE
);

INSERT INTO T VALUES ('Tom',100,'2017-01-01');
INSERT INTO T VALUES ('Amy',200,'2017-01-02');
INSERT INTO T VALUES ('Tom',1311,'2017-01-03');
INSERT INTO T VALUES ('Tom',122,'2017-03-01');
INSERT INTO T VALUES ('Tom',111,'2017-04-01');
INSERT INTO T VALUES ('Amy',232,'2017-05-01');
INSERT INTO T VALUES ('Tom',2312,'2017-05-02');
INSERT INTO T VALUES ('Tom',23,'2017-05-03');

DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);

SET @SQL = STUFF((SELECT distinct ',SUM(CASE WHEN Dt = '''+ CAST(Dt AS VARCHAR(10)) +''' THEN Price ELSE 0 END) AS ' + QUOTENAME(Dt)  
            FROM T 
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');

SET @query = 'SELECT userName,'+@cols+' FROM T GROUP BY userName' ;

EXECUTE sp_executesql @query

因為範例我們使用 SQL SERVER

所以使用 FOR XML PATH 語法將我們** CASE WHEN pivot SQL **語法產生並把他附值給 @cols 變數

SET @cols = STUFF((SELECT distinct ',SUM(CASE WHEN Dt = '''+ CAST(Dt AS VARCHAR(10)) +''' THEN Price ELSE 0 END) AS ' + QUOTENAME(Dt)  
            FROM T 
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
Read more »

前言:

某些專案因為歷史久遠沒有Source Code,但有個需求需要異動裡面的程式該怎麼辦??

難道只能整個反組譯,查看程式碼翻一份做新的嗎?

不~~其實有辦法直接對於DLL進行修改

只需使用 ** Reflexil 搭配 ILSpy 或其他支援的反組譯​軟體 **

Reflexil 是一個組譯編輯器插件目前支援 ReflectorILSpy 和 Telerik’s JustDecompile

下載連結

Reflexil **Release 2.2 搭配 ILSpy version 3.2 


前置動作,安裝

Read more »