Tôi đang gặp một chút rắc rối khi sắp xếp một cách để quản lý các phụ thuộc tự động được giải quyết và thủ công trong các lớp học của mình.Giải quyết các phụ thuộc tự động và thủ công
Giả sử tôi có hai lớp để tính giá: một tính toán số tiền tôi sẽ tính phí cho giao hàng và số tiền khác tôi sẽ tính phí cho toàn bộ đơn đặt hàng. Thứ hai sử dụng giá trị đầu tiên để tính tổng giá vận chuyển cho toàn bộ giá đặt hàng.
Cả hai lớp đều phụ thuộc vào lớp thứ ba mà tôi sẽ gọi cho ExchangeRate mang lại cho tôi tỷ giá hối đoái tôi nên sử dụng để tính giá.
Cho đến nay chúng tôi có dây chuyền này phụ thuộc:
OrderCalculator -> ShippingCalculator -> ExchangeRate
tôi đang sử dụng Ninject để giải quyết những sự phụ thuộc và điều này đã làm việc cho đến bây giờ. Bây giờ tôi có một yêu cầu rằng tốc độ được trả về bởi lớp ExchangeRate sẽ thay đổi theo một tham số sẽ được cung cấp trong Constructor (vì đối tượng sẽ không làm việc mà không có điều này, để làm cho phụ thuộc rõ ràng nó được đặt trên constructor) từ đầu vào của người dùng. Do đó tôi không còn có thể tự động giải quyết các phụ thuộc của mình nữa.
Bất cứ khi nào tôi muốn OrderCalculator hoặc bất kỳ lớp nào khác phụ thuộc vào ExchangeRate, tôi không thể yêu cầu thùng chứa Ninject giải quyết nó cho tôi vì tôi cần cung cấp tham số trong hàm tạo.
Bạn đề xuất gì trong trường hợp này?
Cảm ơn!
EDIT: Hãy thêm một số mã
chuỗi này của các đối tượng được tiêu thụ bởi một dịch vụ WCF và tôi đang sử dụng Ninject như container DI.
public class OrderCalculator : IOrderCalculator { private IExchangeRate _exchangeRate; public OrderCalculator(IExchangeRate exchangeRate) { _exchangeRate = exchangeRate; } public decimal CalculateOrderTotal(Order newOrder) { var total = 0m; foreach(var item in newOrder.Items) { total += item.Price * _exchangeRate.GetRate(); } return total; } } public class ExchangeRate : IExchangeRate { private RunTimeClass _runtimeValue; public ExchangeRate(RunTimeClass runtimeValue) { _runtimeValue = runtimeValue; } public decimal GetRate() { //returns the rate according to _runtimeValue if(_runtimeValue == 1) return 15.3m; else if(_runtimeValue == 2) return 9.9m else return 30m; } } //WCF Service public decimal GetTotalForOrder(Order newOrder, RunTimeClass runtimeValue) { //I would like to pass the runtimeValue when resolving the IOrderCalculator depedency using a dictionary or something //Something like this ObjectFactory.Resolve(runtimeValue); IOrderCalculator calculator = ObjectFactory.Resolve(); return calculator.CalculateOrderTotal(newOrder); }
Hãy xem tôi có hiểu không. My OrderCalculator/ShippingCalculator phải nhận một đối tượng (IExchangeRateFactory) có khả năng xây dựng lớp ExchangeRate và gọi GetExchangeRate truyền tham số thời gian chạy, đúng không? Nếu có, thì tham số runTimeValue sẽ trở thành thứ mà OrderCalculator/ShippingCalculator nên quan tâm và tôi muốn điều đó không vui vẻ. – tucaz
Nếu * none * trong số đó phải xử lý giá trị thời gian chạy, thì nó sẽ đến từ đâu? –
Tôi hiểu những gì bạn đang nói, nhưng nếu tôi làm như vậy thì một cái gì đó (runTimeValue) mà chỉ là một phụ thuộc của ExchangeRate cũng sẽ trở thành một phụ thuộc vào bất kỳ lớp nào khác sử dụng nó. Tôi đang tìm một cách để vượt qua runTimeValue này để DI Container và để cho nó chăm sóc của việc tạo ra các đối tượng. – tucaz