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查询更改为使用字典即可