Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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
C# StructureMap-注入特定实例。如何?_C#_.net_Dependency Injection_Structuremap - Fatal编程技术网

C# StructureMap-注入特定实例。如何?

C# StructureMap-注入特定实例。如何?,c#,.net,dependency-injection,structuremap,C#,.net,Dependency Injection,Structuremap,假设我定义了这个简单的类: public class State { public int Id { get; set; } public string Name { get; set; } } 然后,我将定义、创建和注册50个命名实例。用户登录后,我知道(比如从他的配置设置)他来自哪个状态。在我的控制器里,这很容易说 var userState= ObjectFactory.GetNamedInstance<State>("Idaho"); 但是,要使其工作,必

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

public class State
{
    public int Id { get; set; }
    public string Name { get; set; }
}
然后,我将定义、创建和注册50个命名实例。用户登录后,我知道(比如从他的配置设置)他来自哪个状态。在我的控制器里,这很容易说

var userState= ObjectFactory.GetNamedInstance<State>("Idaho");
但是,要使其工作,必须传递一个特定实例。有没有办法具体说明这一点

还有一件事我刚刚想了一下。我可以将其定义为一组状态,而不是定义50个单独的状态,如下所示:

public class HomeController : ControllerBase
{
    private State _state;

    public HomeController(State state)
    {
        _state = state;
    }
}
public class StateCollection
{
    public List<State> States { get; set; }
}
公共类StateCollection
{
公共列表状态{get;set;}
}

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

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

公共接口ICurrentUserService
{
状态{get;}
}
然后,客户机可以使用LINQ并选择适当的状态。 这是合理的做法吗

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

如果收藏量很大怎么办

这听起来像是过早的优化。如果足够快,就足够快了。但是,当收藏随着时间的推移而增长,并且速度变慢时,会发生什么呢?当您在消费者中实现LINQ语句时,这可能很难修复,因为现在您必须更改所有消费者。如果您在
ICurrentUserService
抽象(或您想称之为抽象的任何东西)的实现中编写此LINQ语句,只需简单重写即可。只需将LINQ查询更改为使用
字典即可