我有一个静态类,我需要向其中注入一些实例。静态类可以有静态构造函数,但它必须是无参数的。那么,我该如何向其中注入一些东西呢?
我不想创建一个单身人士。我希望有一个静态类,并且它的方法之一对应该注入的实例进行操作。下面是我需要的示例:
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 */ }
}
背景信息:这是一个 MVC4 应用程序,所以我使用 ninject.mvc3 插件。
PS:我看到了一些有关 Ninject 和静态方法的问题,但它们似乎都没有解决这样的问题。
不要这样做。不要使用需要自己的依赖项的静态类。这使得测试变得更加困难,并且其他类型依赖于此AuthenticationHelper
将无法将其包含在构造函数中,这意味着它们隐藏了依赖它的事实。
相反,只需做你一直会做的事情:AuthenticationHelper
非静态,实现一个IAuthenticationHelper
接口并通过其公共构造函数注入所有依赖项。
但是,如果您坚持保持该类静态(这又是一个非常糟糕的主意),请创建一个静态Initialize(UserBusiness userBusiness)
方法,并在应用程序的启动路径中调用该方法。你不能让你的 DI 容器调用这个静态方法。他们不允许,因为 1. 这是一个坏主意,2. 这样的静态方法只需要调用一次,所以让你的容器为你自动连接它并没有真正的帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)