C# Unity Dependency Injection—如何在运行时创建要注入的实例
正在尝试在ASP.NETWebAPI项目中实现依赖项注入 我希望能够将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
帐户的实例
注入到我的一些服务中
应使用用户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"];
}
}