【问题标题】:Configuring StructureMap to generate and "remember" a constructor param literal配置 StructureMap 以生成和“记住”构造函数参数文字
【发布时间】:2013-05-20 15:25:02
【问题描述】:

我有一个 StructureMap 配置,类似于:

cfg.For<ICacheOrder>().Use<CacheOrder>().Ctor<int>().Is(context => LoginHelper.LoginID);
cfg.For<ICacheProduct>().Use<CacheProduct>().Ctor<int>().Is(context => LoginHelper.LoginID);
cfg.For<ISQLOrder>().Use<SQLOrder>().Ctor<int>().Is(context => LoginHelper.LoginID);
cfg.For<ISQLProduct>().Use<SQLProduct>().Ctor<int>().Is(context => LoginHelper.LoginID);

通过构造函数注入,可以创建一系列对象,其中一些需要在创建时确定的 int LoginID。静态 LoginHelper 确定 LoginID。

目前在我的配置中,每个创建的对象都会调用 LoginHelper。有没有办法,也许通过 StructureMap 的 IContext,让 LoginID 被“记住”并且只在创建链中确定一次?

我知道我可以重构并创建一个结构映射可以构造和缓存的 ILogin 接口/具体 - 但我希望我的各个层只关心一个简单的 int LoginID。

【问题讨论】:

    标签: dependency-injection structuremap


    【解决方案1】:

    虽然可以在您的服务中注入原始配置值,但当您重复将相同的原始配置值注入多个服务时,您会丢失抽象。

    这显然是您的配置的情况;你缺少一个抽象。

    解决方案是让这些服务依赖于抽象而不是原始值。例如:

    public interface ICurrentUser
    {
        int LoginID { get; }
    }
    

    您可以创建一个相当简单的实现,如下所示:

    public class CurrentUserImpl : ICurrentUser
    {
        public CurrentUserImpl()
        {
            this.LoginID = LoginHelper.LoginID;
        }
    
        public int LoginID { get; private set; }
    }
    

    这意味着您将不得不更改CacheOrderCacheProductSQLOrderSQLProduct 的构造函数,但是当您这样做时,您的配置会变得更易于维护:

    cfg.For<ICacheOrder>().Use<CacheOrder>();
    cfg.For<ICacheProduct>().Use<CacheProduct>();
    cfg.For<ISQLOrder>().Use<SQLOrder>();
    cfg.For<ISQLProduct>().Use<SQLProduct>();
    

    “记住参数文字”的问题现在立即消失了,因为我们现在可以注册ICurrentUser,如下所示:

    cfg.For<ICurrentUser>().Use<CurrentUserImpl>();
    

    Structure Map 中的默认生命周期是每个请求(每个对象图),因此同一个实例被注入到单个对象图中的所有对象中。

    另一种选择是使用HttpContext 生命周期注册它,但这当然只在运行 ASP.NET Web 应用程序时有效。

    【讨论】:

    • 你所描述的(包括使用 HttpContextScoped())正是我昨晚决定做的。 :) 我以前不想引入一个 ICurrentUser ,所有层都需要引用和注意像 int ID 这样简单的东西;但意识到利大于弊。谢谢!
    • @DaveClausen:当所有层都使用这样的ICurrentUser 抽象时,在架构上通常不会有问题,但如果这是一个问题,您可以为每层定义一个抽象(或每组层一个抽象) )。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    相关资源
    最近更新 更多