Tôi đang viết mã chung để xử lý các tình huống khi dữ liệu được tải từ nhiều nguồn. Tôi có một phương pháp có chữ ký sau đây:Đơn giản hóa loại chung loại suy ra
public static TResult LoadFromAnySource<TContract, TSection, TResult>
(this TSection section,
string serviceBaseUri,
string nodeName)
where TSection : ConfigurationSection
where TResult : IDatabaseConfigurable<TContract, TSection>, new()
where TContract : new()
Nhưng nó là một quá mức cần thiết: khi tôi vượt qua TResult
, tôi đã biết những gì TContract
và TSection
chính xác là. Trong ví dụ của tôi:
public interface ISourceObserverConfiguration
: IDatabaseConfigurable<SourceObserverContract, SourceObserverSection>
Nhưng tôi phải viết như sau:
sourceObserverSection.LoadFromAnySource<SourceObserverContract,
SourceObserverSection,
SourceObserverConfiguration>
(_registrationServiceConfiguration.ServiceBaseUri, nodeName);
Bạn có thể thấy rằng tôi phải chỉ rõ cặp <SourceObserverContract, SourceObserverSection>
hai lần, đó là một vi phạm DRY Principe. Vì vậy, tôi muốn viết một cái gì đó như:
sourceObserverSection.LoadFromAnySource<SourceObserverConfiguration>
(_registrationServiceConfiguration.ServiceBaseUri, nodeName);
và làm SourceObserverContract
và SourceObserverSection
suy ra từ giao diện.
Có thể trong C# hoặc tôi nên chỉ định ở mọi nơi theo cách thủ công?
IDatabaseConfigurable
trông giống như:
public interface IDatabaseConfigurable<in TContract, in TSection>
where TContract : ConfigContract
where TSection : ConfigurationSection
{
string RemoteName { get; }
void LoadFromContract(TContract contract);
void LoadFromSection(TSection section);
}
Sau đó mở rộng chỉ gọi hai phương pháp này dựa trên một số logic. Tôi phải xác định các loại bởi vì tôi cần phải truy cập các thuộc tính của từng thực hiện cụ thể, vì vậy tôi cần một hiệp phương sai.
Nếu chữ ký của phương thức là 'IDatabaseConfigurable LoadFromAnySource (phần TSection này, chuỗi serviceBaseUri, string nodeName, Func contractCreator) '(hoặc chỉ' hợp đồng TContract'), các kiểu có thể được suy ra từ cách sử dụng. –
Vi phạm nguyên tắc DRY như thế nào? Đó là một chút phức tạp hơn "không viết cùng một điều hai lần". Bạn có thể không quan tâm rằng bạn viết 't' ba lần trong' twitter', phải không? : D Cả hai đều * không * giống nhau - một là tổng quát hơn cái kia. Trong mọi trường hợp, nhận xét của @JeroenMostert là khá nhiều cách tiếp cận tốt nhất, và hoàn toàn nên là một câu trả lời. Mặc dù có lẽ ở đâu đó giống như Lập trình viên và không phải SO - Tôi không nghĩ đó là một câu hỏi hay cho SO, thực sự. – Luaan
@JeroenMostert Có, nhưng họ sẽ không biết 'IDatabaseConfigurable' nào được sử dụng. – Rob