Dependency injection 配置StructureMap以生成和;记住;构造函数param literal

Dependency injection 配置StructureMap以生成和;记住;构造函数param literal,dependency-injection,structuremap,Dependency Injection,Structuremap,我有一个StructureMap配置,看起来像: cfg.For<ICacheOrder>().Use<CacheOrder>().Ctor<int>().Is(context => LoginHelper.LoginID); cfg.For<ICacheProduct>().Use<CacheProduct>().Ctor<int>().Is(context => LoginHelper.LoginID); c

我有一个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);
cfg.For().Use().Ctor().Is(context=>LoginHelper.LoginID);
cfg.For().Use().Ctor().Is(context=>LoginHelper.LoginID);
cfg.For().Use().Ctor().Is(context=>LoginHelper.LoginID);
cfg.For().Use().Ctor().Is(context=>LoginHelper.LoginID);
通过构造函数注入,可以创建一个对象链,其中一些对象需要在创建时确定的int-LoginID。静态LoginHelper确定LoginID

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


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

尽管可以在服务中注入原始配置值,当您重复地将相同的原语注入多个服务时,您缺少一个抽象

您的配置显然就是这样;您缺少一个抽象概念

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

公共接口ICurrentUser
{
int LoginID{get;}
}
您可以创建一个相当简单的实现,如下所示:

公共类CurrentUserImpl:ICurrentUser
{
public CurrentUserImpl()
{
this.LoginID=LoginHelper.LoginID;
}
public int LoginID{get;private set;}
}
这意味着您将不得不更改
CacheOrder
CacheProduct
SQLOrder
SQLProduct
的构造函数,但当您这样做时,您的配置变得更易于维护:

cfg.For().Use();
cfg.For().Use();
cfg.For().Use();
cfg.For().Use();
“记住参数文字”的问题现在立即消失,因为我们现在可以注册
iccurrentuser
,如下所示:

cfg.For().Use();
结构图中的默认生命周期是每个请求(每个对象图),因此相同的实例被注入到单个对象图中的所有对象中


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

您所描述的(包括使用httpContextScope())正是我昨晚决定做的。:)我以前不想介绍一个ICurrentUser,它是所有层都需要引用和了解的,比如一个int-ID;但他意识到利大于弊。谢谢@DaveClausen:当所有层都使用这样的
iccurrentuser
抽象时,架构上通常不会有问题,但如果这是一个问题,您可以为每层定义一个抽象(或为每层组定义一个抽象)。