我正在使用.Net中的存儲庫模式開發應用程序,作爲我的業務邏輯的一部分,SMS必須發送。代碼應該放在哪裏,以便在我的測試過程中SMS不會實際發送?哪裏可以放置依賴於其他外部第三方服務的代碼?
回答
外部交互,如發送電子郵件,發送短信,呼叫第三方網絡服務等應該在業務層的後面。您可以將它們視爲與存儲庫平行的層。
業務層應該負責與外部服務進行交互,但當然不是直接的。
應該寫一個包裝服務,業務層應該依賴於包裝服務,而不是實際的外部端點。
考慮下面的例子:
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的其他依賴關係的模擬。
注意:上面的代碼純粹是一個例子。你可以有自己的想法,使它適合你的特定需求。
這應該給你提示你如何安排你的圖層和單元測試它們。
真棒,一個很好的答案謝謝。稍微偏離主題,但是您可以在我的要點中對我使用此類通用存儲庫發表意見:https://gist.github.com/jakeam/6ccada92025389263d12e91412182cd1 –
這可行,但將訂單服務與外部系統綁定上或下。如果您可以發送電子郵件,您是否真的想停止處理? CQRS似乎非常適合將域邏輯與這些服務分離。 – Fran
同意......但是如果SMS服務不起作用的用例被正確處理並且它不應該停止系統。監視服務,處理錯誤和異常以及正確的日誌記錄機制應該使事情易於理解,調試和修復。我再次分享的是一個圍繞這個問題展開的示例。根據需求,有多種方式可以與外部服務集成,CQRS可能最適合於此。我對此不太瞭解,所以它並沒有出現在我的腦海裏。 –
- 1. MVC:服務可以依賴於其他服務嗎?
- 2. 設置源代碼依賴於第三方程序集的構建定義?
- 3. 儘量減少對其他第三方庫的依賴
- 4. 哪裏可以放python第三方模塊(lxml)?
- 5. 哪裏可以放置第三方庫來設置C++ linux開發環境?
- 6. 哪裏可以放我的AJAX代碼
- 7. Makefile依賴於第三方庫和cmake
- 8. 用依賴關係在scala代碼中調用外部服務
- 9. 在哪裏部署我的web服務的jar依賴項?
- 10. 在哪裏可以放置Axis2 Web服務的配置文件?
- 11. 我在哪裏可以找到Stanford CoreNLP依賴樹可視化器的代碼?
- 12. iOS核心位置(在哪裏可以放置代碼?)
- 13. 哪裏可以放置代碼配置永久存儲遷移
- 14. 哪裏可以放置CFLOCK?
- 15. 哪裏可以放置@XmlElement?
- 16. 哪裏可以放置InvokeRepeating?
- 17. 哪裏可以放置AutoMapper.CreateMaps?
- 18. AngularJS - 在哪裏放置第三方插件的默認值?
- 19. Python依賴於哪些內核服務?
- 20. 我在哪裏可以放置我的API jar文件依賴的DLL?
- 21. 依賴於其他範圍可變
- 22. 哪裏可以放置代碼來改變UIView的屬性
- 23. 哪裏可以放置頁面特定的JavaScript代碼?
- 24. 哪裏可以放置移動Navbar的代碼來實現css?
- 25. 系統地測試與PayPal和其他類似的外部依賴服務
- 26. 體系結構:何處放置不依賴於任何其他服務或存儲庫組件的服務類
- 27. 依賴於其他不變
- 28. mysql依賴於其他
- 29. 類依賴於其他
- 30. 哪裏應該放置第三方圖書館?
你的意思是,單元測試運行時不應該發送短信? –
這是一種模糊的,但通常你會有一個SMS發件人服務,你會在你的測試中嘲笑。 –
這與存儲庫模式有什麼關係? – Fran