C# Ninject和静态类-如何?
我有一个静态类,需要向其中注入一些实例。静态类可以有静态构造函数,但必须是无参数的。那么,我该如何向它注入一些东西呢 我不想创造一个单身汉。我希望有一个静态类,它的一个方法操作一个应该被注入的实例。下面是我需要的一个例子:C# Ninject和静态类-如何?,c#,static,ninject,C#,Static,Ninject,我有一个静态类,需要向其中注入一些实例。静态类可以有静态构造函数,但必须是无参数的。那么,我该如何向它注入一些东西呢 我不想创造一个单身汉。我希望有一个静态类,它的一个方法操作一个应该被注入的实例。下面是我需要的一个例子: public static class AuthenticationHelper { // Fields. private static object _lock = new object(); private static readonly User
public static class AuthenticationHelper
{
// Fields.
private static object _lock = new object();
private static readonly UserBusiness _userBusiness; // <-- this field needs to be injected.
// Public properties.
public static User CurrentUser
{
get
{
if (IsAuthenticated)
{
User user = (User)Context.Session[SessionKeys.CURRENT_USER];
if (user == null)
{
lock (_lock)
{
if (user == null)
{
user = _userBusiness.Find(CurrentUserId);
Context.Session[SessionKeys.CURRENT_USER] = user;
}
}
}
return user;
}
return null;
}
}
public static int CurrentUserId { get; /* implementation omitted for brevity */ }
public static bool IsAuthenticated { get; /* implementation omitted for brevity */ }
}
公共静态类AuthenticationHelper
{
//田地。
私有静态对象_lock=新对象();
私有静态只读用户业务_UserBusiness;//不要这样做。不要使用需要其自身依赖关系的静态类。这会使测试更加困难,依赖此AuthenticationHelper
的其他类型将无法将其包含在其构造函数中,这意味着它们隐藏了依赖它的事实
相反,只需执行您经常执行的操作:使AuthenticationHelper
非静态,在其上实现iaauthenticationhelper
接口,并通过其公共构造函数注入所有依赖项
但是,如果您坚持使该类保持静态(这也是一个非常糟糕的主意),请创建一个静态Initialize(UserBusiness UserBusiness)
方法,并在应用程序的启动路径中调用此方法。您不能让DI容器调用此静态方法。它们不允许,因为1.这是一个坏主意,2.这样的静态方法只需调用一次,因此让容器自动为您连接此方法并没有真正的帮助。作为补充说明,锁是comp完全没有用,因为您正在锁定对局部变量“user”的访问,该变量不会在2行“if(user==null)”之间更改
您的目的是锁定对Context.Session[CURRENT_USER]元素的访问,因此
User user = (User)Context.Session[SessionKeys.CURRENT_USER];
if (user == null)
{
lock (_lock)
{
user = (User)Context.Session[SessionKeys.CURRENT_USER];
if (user == null)
{
user = _userBusiness.Find(CurrentUserId);
Context.Session[SessionKeys.CURRENT_USER] = user;
}
}
}
我明白了。我没有意识到这是一个如此糟糕的做法,但有了你的解释,我现在可以理解它了,并将遵循你的建议。无论如何,如果没有其他选择,知道如何解决这个问题是很好的。谢谢!这是真的,有时你不能。例如,当将依赖注入引入遗留应用程序时,你将不得不移动小步骤。在这些临时步骤中,有一个可能是这样的解决方案。这很难看,是技术深度,但是临时的(至少应该是这样)。但是如果您的应用程序已经使用DI构建,那么就没有理由这样做。