Tôi vừa hoàn thành cuốn sách của Mark Seemann Injection Dependency in .NET và bây giờ tôi đang cố gắng refactor một số mã cũ. (Tôi không, ở giai đoạn này, dựa vào bất kỳ thùng chứa DI cụ thể nào, thay vì chỉ cố di chuyển tất cả các phụ thuộc vào một nơi).Làm cách nào để áp dụng việc tiêm phụ thuộc vào một nhà máy trừu tượng
Tôi nhìn vào lớp nhà máy sau đó xác định ArchiveType
bằng cách đọc vài byte đầu tiên của các kho lưu trữ với archiveReader.GetArchiveType()
và sau đó trả về một thể hiện của một ArchiveRestorer
dựa trên ArchiveType
enum.
public class ArchiveRestorerFactory : IArchiveRestorerFactory
{
public ArchiveRestorer Create(ArchiveReader archiveReader)
{
ArchiveType type = archiveReader.GetArchiveType();
switch (type)
{
case ArchiveType.CurrentData:
return new CurrentDataArchiveRestorer(archiveReader);
break;
case ArchiveType.HistoricalData:
return new HistoricalDataArchiveRestorer(archiveReader);
break;
case ArchiveType.AuditTrail:
return new AuditTrailArchiveRestorer(archiveReader);
break;
default:
throw new Exception("ArchiveRestorerFactory error: Unknown value for ArchiveType.");
}
}
}
Làm thế nào để cấu trúc lại này để các lớp không phụ thuộc vào các loại bê tông CurrentDataArchiveRestorer
, HistoricalDataArchiveRestorer
và AuditTrailArchiveRestorer
?
Tôi có nên di chuyển ba người khôi phục bê tông vào nhà xây dựng của nhà máy không?
public ArchiveRestorer Create(ArchiveReader archiveReader,
ArchiveRestorer currentDataArchiveRestorer,
ArchiveRestorer historicalDataArchiveRestorer,
ArchiveRestorer auditTrailDataArchiveRestorer)
{
// guard clauses...
// assign to readonly fields
}
Đó dường như là cách tiếp cận đề nghị here, nhưng sau đó nó sẽ nhanh chóng cả ba phục chế khi chỉ có một là cần thiết? Điều gì xảy ra nếu tôi có 20 cách triển khai cụ thể khác nhau có thể thay thế?
Tôi cảm thấy như tôi nên triển khai một nhà máy cụ thể cho từng loại nhà phục chế và trả lại thay vào đó nhưng sau đó tôi chỉ thay thế new
bằng một loại khác.
Cách tốt nhất để cấu trúc lại cái này là gì?
Tôi nghĩ kịch bản của bạn có thể phù hợp hơn với một chuỗi mô hình trách nhiệm. Xem [ví dụ này] (http://davidhayden.com/blog/dave/archive/2008/11/19/ChainResponsibilityDesignPatternUnityDependencyInjectionContainer.aspx) để sử dụng mẫu cùng với một vùng chứa DI (Unity) cụ thể. –
Tôi sẽ không thực hiện việc đăng ký và lắp ráp chuỗi theo cách đó, nhưng nó chắc chắn là một cách tiếp cận hợp lệ. –
Ngoài việc sử dụng 'thừa'? 'Của 'enum', điều gì đặc biệt làm phiền bạn về việc triển khai hiện tại của bạn? –