2017-03-02 16 views
0

我正在使用.Net中的存儲庫模式開發應用程序,作爲我的業務邏輯的一部分,SMS必須發送。代碼應該放在哪裏,以便在我的測試過程中SMS不會實際發送?哪裏可以放置依賴於其他外部第三方服務的代碼?

+0

你的意思是,單元測試運行時不應該發送短信? –

+0

這是一種模糊的,但通常你會有一個SMS發件人服務,你會在你的測試中嘲笑。 –

+0

這與存儲庫模式有什麼關係? – Fran

回答

2

外部交互,如發送電子郵件,發送短信,呼叫第三方網絡服務等應該在業務層的後面。您可以將它們視爲與存儲庫平行的層。

業務層應該負責與外部服務進行交互,但當然不是直接的。

應該寫一個包裝服務,業務層應該依賴於包裝服務,而不是實際的外部端點。

考慮下面的例子:

public interface ISmsService 
{ 
    bool SendSms(string toNumber, string messageBody); 
} 

public class TwilioSmsService : ISmsService 
{ 
    public bool SendSms(string toNumber, string messageBody) 
    { 
     // Send SMS using twilio 
     return true; 
    } 
} 

public interface ICustomerRepository 
{ 
    Customer GetCustomer(string customerId); 
} 

public class CustomerRepository : ICustomerRepository 
{ 
    public Customer GetCustomer(string customerId) 
    { 
     Expression<Func<Customer, bool>> criteria = cust => cust.CustomerId.Equals(customerId); 
     return return Context.Set<Customer>.FirstOrDefault(criteria); 
    } 
} 

public class OrderService 
{ 
    private IOrderRepository orderRepository; 
    private ISmsService smsService; 
    public ICustomerRepository customerRepository; 

    public OrderService(IOrderRepository orderRepository, ICustomerRepository customerRepository, ISmsService smsService) 
    { 
     this.orderRepository = orderRepository; 
     this.customerRepository = customerRepository; 
     this.smsService = smsService; 
    } 

    public void PlaceOrder(Order orderObj, string customerId) 
    { 
      this.orderRepository.SaveOrder(orderObj); 
      var customer = this.customerRepository.GetCustomer(customerId); 
      this.smsService.SendSms(customer.MobileNo, "You order is received successfully"); 
    } 
} 

現在你可以不實際發送短信的單元測試OrderService。您需要創建ISMSService和OrderService的其他依賴關係的模擬。

注意:上面的代碼純粹是一個例子。你可以有自己的想法,使它適合你的特定需求。

這應該給你提示你如何安排你的圖層和單元測試它們。

+0

真棒,一個很好的答案謝謝。稍微偏離主題,但是您可以在我的要點中對我使用此類通用存儲庫發表意見:https://gist.github.com/jakeam/6ccada92025389263d12e91412182cd1 –

+0

這可行,但將訂單服務與外部系統綁定上或下。如果您可以發送電子郵件,您是否真的想停止處理? CQRS似乎非常適合將域邏輯與這些服務分離。 – Fran

+0

同意......但是如果SMS服務不起作用的用例被正確處理並且它不應該停止系統。監視服務,處理錯誤和異常以及正確的日誌記錄機制應該使事情易於理解,調試和修復。我再次分享的是一個圍繞這個問題展開的示例。根據需求,有多種方式可以與外部服務集成,CQRS可能最適合於此。我對此不太瞭解,所以它並沒有出現在我的腦海裏。 –

相關問題