Tôi đang sử dụng Simple Injector, nhưng có lẽ những gì tôi cần là một câu trả lời khái niệm hơn.Làm cách nào để sử dụng tính năng tiêm phụ thuộc, lấy cấu hình từ nhiều nguồn?
Dưới đây là thỏa thuận này, giả sử tôi có một giao diện với các thiết lập ứng dụng của tôi:
public interface IApplicationSettings
{
bool EnableLogging { get; }
bool CopyLocal { get; }
string ServerName { get; }
}
Sau đó, người ta thường sẽ có một lớp mà thực hiện IApplicationSettings, nhận được từng lĩnh vực từ một nguồn cụ thể, ví dụ:
public class AppConfigSettings : IApplicationSettings
{
private bool? enableLogging;
public bool EnableLogging
{
get
{
if (enableLogging == null)
{
enableLogging = Convert.ToBoolean(ConfigurationManager.AppSettings["EnableLogging"];
}
return enableLogging;
}
}
...
}
HOWEVER! Giả sử tôi muốn lấy EnableLogging
từ app.config, CopyLocal
từ cơ sở dữ liệu và ServerName
từ triển khai khác nhận tên máy tính hiện tại. Tôi muốn có thể trộn kết hợp với cấu hình ứng dụng của mình mà không cần phải tạo 9 lần triển khai, một cho mỗi kết hợp.
Tôi giả định rằng tôi không thể chuyển bất kỳ thông số nào vì các giao diện được giải quyết bởi bộ phun (vùng chứa).
Tôi nghĩ về điều này, ban đầu:
public interface IApplicationSettings<TEnableLogging,TCopyLocal,TServerName>
where TEnableLogging : IGetValue<bool>
where TCopyLocal : IGetValue<bool>
where TServerName : IGetValue<string>
{
TEnableLogging EnableLog{get;}
TCopyLocal CopyLocal{get;}
TServerName ServerName{get;}
}
public class ApplicationSettings<TEnableLogging,TCopyLocal,TServerName>
{
private bool? enableLogging;
public bool EnableLogging
{
get
{
if (enableLogging == null)
{
enableLogging = Container.GetInstance<TEnableLogging>().Value
}
return enableLogging;
}
}
}
Tuy nhiên, với điều này tôi có một vấn đề chính: Làm sao tôi biết làm thế nào để tạo ra một thể hiện của TEnableLogging
(mà là một IGetValue<bool>
)? Giả sử rằng IGetValue<bool>
là một giao diện có thuộc tính Giá trị, sẽ được lớp bê tông triển khai thực hiện. Nhưng lớp bê tông có thể cần một số chi tiết cụ thể (như tên của khóa trong app.config) hay không (tôi có thể chỉ muốn trả về luôn đúng).
Tôi tương đối mới để tiêm phụ thuộc, vì vậy có thể tôi đang suy nghĩ sai. Có ai có bất kỳ ý tưởng về cách thực hiện điều này?
(Bạn có thể trả lời sử dụng một thư viện DI, tôi sẽ không quan tâm. Tôi nghĩ rằng tôi chỉ cần lấy các khái niệm về nó.)
Cảm ơn bạn, khiến rất nhiều ý nghĩa! Thú vị là cả hai chúng tôi đã thực hiện các bước tương tự và nhận ra một điều gì đó đang diễn ra theo cách mà nó nên là haha –