Unity依赖注入 - 如何创建要在运行时注入的实例

时间:2014-07-24 21:01:06

标签: c# asp.net dependency-injection

尝试在ASP.Net Web API项目中实现依赖注入。

我希望能够在我的某些服务中注入Account的实例。

应该使用用户Account创建Guid实例,直到运行时才知道这一点。

所以在我的服务中我有:

        public TransactionService(Account acc)
        {
            _account = acc;
        }

在我的应用程序启动中,我可以这样做 - 容器是一个新的UnityContainer

container.RegisterType<Instanet.Engine.Account>(new InjectionConstructor(new Guid("xxxxxx")));

这当然没有任何好处,因为它会为每个用户/请求等使用相同的Account

如果我尝试使用类似的东西:

container.RegisterType<Instanet.Engine.Account>(new InjectionConstructor(GetTheUsersID()));

... GetTheUsersID()需要检查cookie或ASP.Net Identity请求,当然在应用启动时不可用。

所以 - 在哪里/如何(简单来说,这个DI的东西会伤害我的大脑)我是否实现了这个,所以我可以将一个实例Account注入到任何可能需要它的服务中。

2 个答案:

答案 0 :(得分:1)

您通常不希望混合通过容器解析的组件的状态和行为 - DI应该用于可以建模为纯服务的组件。

尽管如此,有时在服务组件中包装全局或特定于上下文的状态是有意义的。

在您的情况下,如果您只需要在一个或多个服务中本地使用UserId(换句话说,不将其从一个服务传递到另一个服务)。你提到能够从cookie中获取UserId,所以它可能看起来像:

public class CookieService : ICookieService
{
  public int GetCurrentUserId()
  {
    //pseudo code
    return HttpContext.Current.GetCookie["UserId"];
  }
}

现在您可以在需要UserId的地方注入ICookieService。

更复杂的案例可能需要抽象工厂:

http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/

答案 1 :(得分:0)

如果会话只有一个Account实例,那么我将在所有服务运行之前在引导代码中创建一个Account实例。

然后,您可以填充帐户实例中的guid和所有其他数据,并通过container.RegisterInstance方法在Unity中注册Account类的初始化实例。

稍后它将解决您所需的问题。

有帮助吗?