Điều này không nhất thiết phải như vậy. Chừng nào logger tĩnh của bạn cho thấy một phương pháp để:
- Injection của các lớp bạn muốn tiêm, hoặc
- Injection của DI container trong một cuộc gọi phương pháp thích hợp trước khi chạy nó (nói trong một cái gì đó giống như asp .net global.asax Application_Start method), sau đó bạn sẽ ổn thôi.
Đây là một ví dụ. Lấy lớp sau cho DI:
public class Logger : ILogger
{
public void Log(string stringToLog)
{
Console.WriteLine(stringToLog);
}
}
public interface ILogger
{
void Log(string stringToLog);
}
Và đây là lớp tĩnh của chúng tôi mà cần một logger:
public static class SomeStaticClass
{
private static IKernel _diContainer;
private static ILogger _logger;
public static void Init(IKernel dIcontainer)
{
_diContainer = dIcontainer;
_logger = _diContainer.Get<ILogger>();
}
public static void Log(string stringToLog)
{
_logger.Log(stringToLog);
}
}
Bây giờ, trong một khởi động toàn cầu cho ứng dụng của bạn (trong trường hợp này, trong global.asax của tôi .cs), bạn có thể khởi tạo DI Container của bạn, sau đó đưa nó cho lớp tĩnh của bạn.
public class Global : Ninject.Web.NinjectHttpApplication
{
protected override IKernel CreateKernel()
{
return Container;
}
static IKernel Container
{
get
{
var standardKernel = new StandardKernel();
standardKernel.Bind<ILogger>().To<Logger>();
return standardKernel;
}
}
void Application_Start(object sender, EventArgs e)
{
SomeStaticClass.Init(Container);
SomeStaticClass.Log("Dependency Injection with Statics is totally possible");
}
Và mau! Bạn hiện đang hoạt động với DI trong các lớp tĩnh của bạn.
Hy vọng rằng sẽ giúp ai đó. Tôi đang làm việc lại một ứng dụng sử dụng rất nhiều các lớp tĩnh, và chúng tôi đã sử dụng nó thành công trong một thời gian.
Nguồn
2012-08-20 20:47:44
Dường như tôi giống như độ phân giải phụ thuộc hơn so với tiêm phụ thuộc. Lớp tĩnh bây giờ có kiến thức về khung phụ thuộc. Nhưng sẽ không khó để thích ứng với nó để tránh nó. (Giải quyết trong application_start và khởi tạo với phụ thuộc giải quyết, thay vì cung cấp giải quyết trong khởi tạo.) –
Câu hỏi đặt ra là tiêm một lớp tĩnh vào một lớp tĩnh. Điều này đề cập đến cách tiêm một cá thể không tĩnh vào một lớp tĩnh. Điều này giống như một câu trả lời cho câu sau trong câu trả lời trước: "Ngoài ra nó là khá khó để tiêm bất cứ điều gì đến một lớp tĩnh" –
Điều này có vẻ quá phức tạp cho một cái gì đó đơn giản như một logger. – rolls