Asp.net mvc 静态类中的AutoFac DI
我们有一个ASP.NET项目,我们使用AutoFac进行DI。 我们有一个包含所有数据库查询的服务层,我们需要在静态类中进行一些查询 这是我们在Global.asax中注册依赖项的方式: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
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注册我的类,其余的我都是这样做的。谢谢