Dependency injection 手动解决统一依赖关系

Dependency injection 手动解决统一依赖关系,dependency-injection,unity-container,Dependency Injection,Unity Container,是否可以在方法内部进行解析,而不是在构造函数或类的属性中注入依赖项 public void Foo() { if (...) var context = Unity.Resolve<Context>(); } public void Foo() { 如果(…) var context=Unity.Resolve(); } 其思想是一种条件依赖解析,它使用统一来管理在通常DI使用中创建的对象的生存期。DI设置在Web Api项目中,因此MVC Depende

是否可以在方法内部进行解析,而不是在构造函数或类的属性中注入依赖项

public void Foo()
{
    if (...)
        var context = Unity.Resolve<Context>();
}
public void Foo()
{
如果(…)
var context=Unity.Resolve();
}

其思想是一种条件依赖解析,它使用统一来管理在通常DI使用中创建的对象的生存期。DI设置在Web Api项目中,因此MVC DependencyResolver.Current将无法工作。

这不是一个好主意。应用程序中唯一应该了解容器的部分是组合根。这是一个反模式的服务定位器的示例,因为依赖项没有显式声明


听起来您想引入一种工厂类型,它可以通过构造函数注入进行注入。

虽然有些人认为这是一种不好的模式,但您可以实现一种简单的静态服务定位器模式,如下所示:

public static class Unity
{
    private static IUnityContainer _container;

    public static void SetAppContainer(IUnityContainer container)
    {
        _container = container;
    }

    public static T Resolve<T>()
    {
        return _container.Resolve<T>();
    }
}
公共静态类统一
{
专用静态IUnityContainer\u容器;
公共静态void SetAppContainer(IUnityContainer容器)
{
_容器=容器;
}
公共静态T解析()
{
返回_container.Resolve();
}
}

是的,这是一种反模式,但我有一种情况需要适当的性能。您能解释更多吗?一种情况是使用令牌进行身份验证:在我的应用程序中,令牌99%的时间在没有数据库访问的情况下工作,因此我不需要新的上下文(当然这是正常的,但规模可能会有问题)。在正常情况下,应该始终使用构造函数注入。听起来您的身份验证基础结构需要重新构造。对于Web API中的大多数区域,您不应该需要任何服务定位器。您是否使用OAuth和基于声明的身份验证?在这种情况下,您应该有一些用于登录的端点,该端点执行数据库检查,然后所有其他需要身份验证的端点都应该有当前用户对当前用户主体的声明集。你能解释一下哪种类型需要上下文以及为什么吗?我想知道Web Api是否有一些内置功能,比如MVC DependencyResolver.Current(它与你的代码相同)。是的。我们以前用过。我也在使用这个解决方案,但它需要将容器对象存储到所有应用程序范围中,因此您的解决方案需要位于内置Unity之上。当config.DependencyInjection设置为UnityResolver时,我无法访问此属性以获取当前DI并使用它。看起来我可以使用GlobalConfiguration.Configuration.DependencyResolver访问UnityResolver并强制转换对象类型。我现在来看看。