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

本文关键字:注入 实例 创建 运行时 依赖 何创建 Unity | 更新日期: 2023-09-27 18:14:46

尝试在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到任何可能需要它的服务。

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

您通常不希望将通过容器解析的组件的状态和行为混合在一起——应该将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/

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

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

以后它会解析成你需要的。

有帮助吗?