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
到任何可能需要它的服务。
您通常不希望将通过容器解析的组件的状态和行为混合在一起——应该将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方法。以后它会解析成你需要的。
有帮助吗?