Asp.net mvc 静态类中的AutoFac DI

Asp.net mvc 静态类中的AutoFac DI,asp.net-mvc,dependency-injection,autofac,Asp.net Mvc,Dependency Injection,Autofac,我们有一个ASP.NET项目,我们使用AutoFac进行DI。 我们有一个包含所有数据库查询的服务层,我们需要在静态类中进行一些查询 这是我们在Global.asax中注册依赖项的方式: public class Dependencies { public static void RegisterDependencies() { var builder = new ContainerBuilder(); builder.RegisterContr

我们有一个ASP.NET项目,我们使用AutoFac进行DI。 我们有一个包含所有数据库查询的服务层,我们需要在静态类中进行一些查询

这是我们在Global.asax中注册依赖项的方式:

public class Dependencies
{
    public static void RegisterDependencies()
    {
        var builder = new ContainerBuilder();

        builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired();

        builder.RegisterModule(new ServiceModule());
        builder.RegisterModule(new EfModule());

        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}

public class ServiceModule : Autofac.Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterAssemblyTypes(Assembly.Load("MyApp.Service")).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerLifetimeScope();
    }

}

public class EfModule : Autofac.Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType(typeof(myDataContext)).As(typeof(IMyContext)).InstancePerLifetimeScope();
    }
}
这就是我们在控制器中访问的方式:

public class SomeController : Controller
{
    private readonly IService1 _service1;
    private readonly IService2 _service2;

    public SomeController(IService1 service1, IService2 service2)
    {
        _service1 = service1;
        _service2 = service2;
    }


    public ActionResult Index()
    {
        var service = _service1.GetAll();
        ...

        return View(searchModel);
    }
}
现在我们需要在一个静态类中从数据库中检索数据,所以我们必须调用我们的服务层,但我们不知道如何做……我们已经看到了这一点,但我不知道它是否正确,但它是有效的

public static Test ()
{
    ...
    var service1 = DependencyResolver.Current.GetService<IService1>();
    ...
}
公共静态测试()
{
...
var service1=DependencyResolver.Current.GetService();
...
}
另外,在非静态类和静态类中都是怎样的呢

提前谢谢

问题是我必须从不同的地方给这些班级打电话,我不想依靠服务来给班级打电话,我希望班级能处理好一切

在这种情况下,您应该向Autofac注册类,以便注入其依赖项:

builder.RegisterType<MyClass>();
现在,您可以在控制器中插入
MyClass
依赖项并使用它,而无需了解其内部或依赖项:

public class MyClass
{
    private readonly IService1 _service1;

    public MyClass(IService1 service1) 
    {
        _service1 = service1;
    }

    public void Test
    {
        // use the _service1 instance to do whatever you want
    }
}
public class SomeController : Controller
{
    private readonly IService1 _service1;
    private readonly IService2 _service2;

    private readonly MyClass _myClass;

    public SomeController(IService1 service1, IService2 service2, MyClass myClass)
    {
        _service1 = service1;
        _service2 = service2;
        _myClass = myClass;
    }


    public ActionResult Index()
    {
        var service = _service1.GetAll();
        ...

        _myClass.Test();

        return View(searchModel);
    }
}  

您不能(也不应该)注入到静态类中。想想当两个web请求同时进入并尝试访问同一个上下文对象时会发生什么。相反,为什么不将服务作为参数传入呢?好的,如果类不是静态的呢?我该怎么做?我想要的是,我可以在不知道类内部发生了什么的情况下调用类内部的方法,因此,因为我需要从数据库中检索信息,所以我需要调用一个服务(或多个)但是我不想担心类外的服务…因为我只想调用它并获取信息。在请求的生命周期中,静态类在哪里?如果它在
控制器中的某个地方被调用
,请按照DavidG告诉您的那样执行:将函数声明为
公共静态测试(IService1 service1)
,并从
控制器
传入
服务1
。在这种情况下,从帐户控制器传入该类……那么,为什么该类应该是静态的呢?静态的定义与依赖注入(通常是依赖倒置原则的概念)不同。这是一个很好的解决方案,但我已经尝试了这个解决方案,我不需要向AutoFac注册我的类,其余的我都是这样做的。谢谢