首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >StructureMap -注入特定实例。怎么做?

StructureMap -注入特定实例。怎么做?
EN

Stack Overflow用户
提问于 2012-11-10 01:30:59
回答 1查看 193关注 0票数 0

假设我定义了这个简单的类:

代码语言:javascript
复制
public class State
{
    public int Id { get; set; }
    public string Name { get; set; }
}

然后,我将定义、创建和注册50个命名实例。用户登录后,我知道(比如从他的配置设置)他来自哪个状态。在我的控制器中,很容易说出

代码语言:javascript
复制
var userState= ObjectFactory.GetNamedInstance<State>("Idaho");

然而,我更愿意在构造函数中传递它,如下所示:

代码语言:javascript
复制
public class HomeController : ControllerBase
{
    private State _state;

    public HomeController(State state)
    {
        _state = state;
    }
}

但是,要让它正常工作,必须传递一个特定的实例。有没有办法指定这一点?

我刚想到的另一件事。我可以将它定义为状态的集合,而不是定义50个单独的状态,如下所示:

代码语言:javascript
复制
public class StateCollection
{
    public List<State> States { get; set; }
}

然后在构造函数中传递StateCollection。然后,客户端可以使用LINQ并选择适当的状态。这是一个合理的方法吗?如果集合很大怎么办?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-10 23:38:01

你想做的就是基于上下文的注入。尽管可以这样做,但基于上下文的注入通常表示应用程序设计中的错误。在您的例子中,您似乎缺少一个简单的ICurrentUserService抽象,它提供系统中当前用户的信息:

代码语言:javascript
复制
public interface ICurrentUserService
{
    State State { get; }
}

然后

客户端可以使用LINQ并选择适当的状态。这是一个合理的方法吗?

不,它可能不是,因为这让客户端负责为用户查找正确的状态,而您已经知道了这一点。同样,使用正确的抽象。这使得客户端代码变得更容易。

如果集合很大怎么办?

对我来说,这听起来像是过早的优化。如果它足够快,那就足够快了。但是,当集合随着时间增长而变得更慢时会发生什么呢?好吧,当你在消费者中实现LINQ语句时,这可能很难修复,因为现在你必须改变所有的消费者。如果你在ICurrentUserService抽象的实现(或者你想叫它的任何东西)中编写这个LINQ语句,只需简单地重写一次即可。只需将LINQ查询更改为使用Dictionary<string, State>,就完成了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13313017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档