【问题标题】:Ninject - Setting dependencies constructor with run-time valueNinject - 使用运行时值设置依赖构造函数
【发布时间】:2013-08-17 02:29:03
【问题描述】:

我对 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());

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

【问题讨论】:

    标签: dependency-injection ninject


    【解决方案1】:

    一般来说,您应该尽量避免尝试将原始值注入服务,除非:

    • 它们是配置值,-和-
    • 只需将它们注入到单个服务中。

    如果其中任何一个为假,则不应直接注入原语。

    在您的情况下,您正在处理上下文信息,这值得自己抽象:

    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();
    

    为单个字符串创建接口可能看起来很愚蠢,但它有一些明显的优势:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 2015-02-07
      • 2011-08-29
      • 1970-01-01
      相关资源
      最近更新 更多