Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection Ninject-使用运行时值设置依赖项构造函数_Dependency Injection_Ninject - Fatal编程技术网

Dependency injection Ninject-使用运行时值设置依赖项构造函数

Dependency injection Ninject-使用运行时值设置依赖项构造函数,dependency-injection,ninject,Dependency Injection,Ninject,我对DI/Ninject相当陌生,似乎不知道我需要做什么。我有这样的服务: public class ArchiveService : IArchiveService { private string sAuditUser = "USER"; public ArchiveService(string AuditUser) { sAuditUser = AuditUser; } ... } string sUser = HttpConte

我对DI/Ninject相当陌生,似乎不知道我需要做什么。我有这样的服务:

public class ArchiveService : IArchiveService
{
    private string sAuditUser = "USER";

    public ArchiveService(string AuditUser)
    {
        sAuditUser = AuditUser;
    }
    ...
}
string sUser = HttpContext.Session["UID"].ToString();
ArchiveService svcArchive = new ArchiveService(Session["UID"].ToString());
我当前实例化的服务如下所示:

public class ArchiveService : IArchiveService
{
    private string sAuditUser = "USER";

    public ArchiveService(string AuditUser)
    {
        sAuditUser = AuditUser;
    }
    ...
}
string sUser = HttpContext.Session["UID"].ToString();
ArchiveService svcArchive = new ArchiveService(Session["UID"].ToString());

当用户成功登录帐户页面时,将设置会话值。如何设置服务依赖项以使其正确获取该值?

通常,您应该避免尝试将原始值注入服务,除非:

  • 它们是配置值,-和-
  • 它们只需注入到单个服务中
如果其中一个为false,则不应直接注入原语

在您的案例中,您处理的是上下文信息,它值得自己进行抽象:

公共接口IUserContext
{
字符串名称{get;}
}
有了这个抽象,所有需要了解代表操作执行的当前用户的任何信息的服务都可以依赖于这个抽象

公共类ArchiveService:IArchiveService
{
私有IUserContext用户上下文;
公共ArchiveService(IUserContext userContext)
{
this.userContext=userContext;
}
}
现在唯一需要做的就是创建一个注册的
IUserContext
实现。此实现的外观完全取决于您正在运行的应用程序类型(ASP.NET、Win Forms、WCF等),但在您的特定情况下,它的实现方式如下:

公共类AspNetUserContext:IUserContext
{
公共字符串名
{ 
得到
{
返回HttpContext.Current.Session[“UID”].ToString();
}
}
}
这是您注册它的方式:

Bind<IUserContext>().To<AspNetUserContext>().InSingletonScope();
Bind().To().InSingletonScope();
为单个字符串创建接口似乎很愚蠢,但它有一些明显的优点:

  • 新的抽象更清楚地传达了该值是什么。
    字符串可以是任何东西。它可以是路径、连接字符串等
  • 抽象将如何将用户信息集中到一个地方的知识集中起来
  • 因为新的抽象是明确的,所以在容器中注册它变得更加容易。配置将更易于维护
  • 该解决方案不太容易出错,因为我们集中了提供用户信息的方式