У нас есть проект ASP.NET, и мы используем AutoFac для DI. У нас есть уровень сервиса со всеми запросами базы данных, и нам нужно сделать некоторые запросы в статическом классе.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>();
...
}
Также, как это было бы в нестатических и статических классах?
Заранее спасибо.
Вы не можете (и не должны) вводить в статический класс. Подумайте, что произойдет, когда одновременно появятся 2 веб-запроса и попытайтесь получить доступ к одному и тому же объекту контекста. Вместо этого, почему бы не пройти службу в качестве параметра? – DavidG
Хорошо, что если класс не является статичным? Как я могу это сделать? Я хочу, чтобы я мог вызвать метод внутри класса, не зная, что происходит внутри, поэтому, поскольку мне нужно получить информацию из базы данных, мне нужно вызвать услугу (или несколько), но я не хочу беспокоиться об этих услуги за пределами класса ... так как я хочу просто позвонить и получить информацию. –
Где ваш статический класс находится в жизненном цикле запроса? Если это называется где-то в вашем «Контроллере», сделайте то, что сказал вам DavidG: объявите функцию «public static Test (IService1 service1)» и перейдите в 'service1' из вашего' Controller'. –