C# Unity Dependency Injection—如何在运行时创建要注入的实例

C# Unity Dependency Injection—如何在运行时创建要注入的实例,c#,asp.net,dependency-injection,C#,Asp.net,Dependency Injection,正在尝试在ASP.NETWebAPI项目中实现依赖项注入 我希望能够将帐户的实例注入到我的一些服务中 应使用用户Guid创建帐户实例,直到运行时才知道这一点 因此,在我的服务中,我: public TransactionService(Account acc) { _account = acc; } 在我的应用程序启动中,我可以这样做—其中容器是一个新的UnityContainer: container.RegisterT

正在尝试在ASP.NETWebAPI项目中实现依赖项注入

我希望能够将
帐户的实例
注入到我的一些服务中

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

因此,在我的服务中,我:

        public TransactionService(Account acc)
        {
            _account = acc;
        }
在我的应用程序启动中,我可以这样做—其中容器是一个新的
UnityContainer

container.RegisterType<Instanet.Engine.Account>(new InjectionConstructor(new Guid("xxxxxx")));
。。。如果GetTheUsersID()需要检查cookie或ASP.Net身份请求,则在应用程序启动时当然不可用


那么-在哪里/如何(请简单地说,这个DI东西正在伤害我的大脑)我应该实现它,这样我就可以将一个实例
帐户
注入可能需要它的任何服务中。

如果会话只有一个可能的帐户实例,然后在所有服务运行之前,我将在引导代码中创建一个帐户实例

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

稍后,它将解决您需要的问题


它有帮助吗?

对于通过容器解析的组件,您通常不希望将状态和行为混合在一起——对于可以建模为纯服务的组件,应该使用DI

也就是说,有时在服务组件中包装全局或特定于上下文的状态是有意义的

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

public class CookieService : ICookieService
{
  public int GetCurrentUserId()
  {
    //pseudo code
    return HttpContext.Current.GetCookie["UserId"];
  }
}
现在,您可以在需要用户ID的地方注入ICookieService

更复杂的情况可能需要一个抽象工厂:


关于混合行为,我完全同意。但我遇到的问题是,与服务交互的许多遗留方法都需要一个帐户实例——因此,在构建新的API之前,我必须使用遗留的东西。DI似乎是准备好帐户的更好方法,而不是在服务中更新帐户。不过我很喜欢你的想法,明天我会试一试:D谢谢你提供的好信息。谢谢,虽然没有多大帮助。据我所知,当应用程序第一次启动时,引导代码是可以运行的。因此,问题是,我需要的一些信息目前不可用。这个账户也是遗留的东西,这使得它更加困难。
public class CookieService : ICookieService
{
  public int GetCurrentUserId()
  {
    //pseudo code
    return HttpContext.Current.GetCookie["UserId"];
  }
}