一般来说,您应该尽量避免尝试将原始值注入服务,除非:
- 它们是配置值, -并且-
- 它们只需注入到单个服务中。
如果其中任何一个为假,则不应直接注入原语。
在您的情况下,您正在处理上下文信息,这值得自己抽象:
public interface IUserContext
{
string Name { get; }
}
有了这个抽象,所有需要知道当前用户代表谁执行操作的所有服务都可以依赖这个抽象。
public class ArchiveService : IArchiveService
{
private IUserContext userContext;
public ArchiveService(IUserContext userContext)
{
this.userContext = userContext;
}
}
您现在唯一要做的就是创建一个IUserContext
您注册的实现。这个实现看起来如何完全取决于您正在运行的应用程序的类型(ASP.NET、Win Forms、WCF 等),但在您的特定情况下,这就是它的实现方式:
public class AspNetUserContext : IUserContext
{
public string Name
{
get
{
return HttpContext.Current.Session["UID"].ToString();
}
}
}
这就是您注册它的方式:
Bind<IUserContext>().To<AspNetUserContext>().InSingletonScope();
为单个字符串创建接口可能看起来很愚蠢,但它有一些明显的优势:
- 新的抽象更清楚地传达了该值是什么。A
string
可以是任何东西。它可以是路径、连接字符串等。
- 抽象集中了如何将这些用户信息获取到一个地方的知识。
- 由于新的抽象是明确的,因此在容器中注册它变得更加容易。配置将更易于维护。
- 该解决方案不易出错,因为我们集中了提供用户信息的方式。