它已被充分记录,如何将依赖项注入服务.
问题:但是在ASP.NET Core 2.0中是否(已经)可以让系统的DI机制自动将服务注入方法或属性?
旁注:在PHP-Symfony中,这种模式称为setter injection.
示例:
假设MyBaseController我的项目中的所有控制器都有一个公共类,我希望注入一个服务(例如UserManager服务),MyBaseController以后可以在所有子控制器中访问.我可以使用构造函数注入将服务注入子类并将其传递base(userManager)给父类.但是必须在所有控制器的所有子构造器中执行此操作非常繁琐.
所以我想像这样设置一个setter MyBaseController:
public abstract class MyBaseController : Controller
{
public UserManager<User> userManager { get; set; }
// system should auto inject UserManager here
public void setUserManager(UserManager<User> userManager) {
this.userManager = userManager;
}
}
Run Code Online (Sandbox Code Playgroud)
...所以我不必在每个子构造函数中执行以下操作只是为了将依赖项传递给父级:
public class UsersController : MyBaseController
{
public ChildController(UserManager<User> userManager) : base(userManager) {}
Run Code Online (Sandbox Code Playgroud)
更新:这里给出的答案是我想要实现的,但问题是ASP.NET Core 1.0,我对ASP.NET Core 2.0中是否添加了任何解决方案感兴趣.
c# dependency-injection asp.net-core-2.0 asp.net-core-mvc-2.0
如何实现属性和方法依赖注入?如何添加服务?最后,与使用构造函数注入相比,这能产生多大的影响?
是否可以使用属性/方法注入代替构造函数注入?
.Net 初学者,我们将不胜感激<3
在我使用构造函数 DI 的包装类中:
private ICustomerRepository _customerRepository; //For customer
private ICountryRepository _countryRepository; //For country
private IRegionRepository _regionRepository; //for region
private ICityRepository _cityRepository; //for city
// Constructor
public RepositoryWrapper(OmniConnectDB context, ICustomerRepository customerRepository, IMapper mapper, ICountryRepository countryRepository, IRegionRepository regionRepository, ICityRepository cityRepository)
{
_context = context;
_mapper = mapper;
_customerRepository = customerRepository;
_countryRepository = countryRepository;
_regionRepository = regionRepository;
_cityRepository = cityRepository;
}
Run Code Online (Sandbox Code Playgroud)
在服务方面:
// configure DI for Location Repositories
services.AddScoped<ICountryRepository, CountryRepository>();
services.AddScoped<IRegionRepository, RegionRepository>();
services.AddScoped<ICityRepository, CityRepository>();
// Configure DI for Customer …Run Code Online (Sandbox Code Playgroud) 是否可以配置 ASP.NET Core DI 来解析所有类?类似于 Autofac AnyConcreteTypeNotAlreadyRegisteredSource 功能的东西。
我可以在 ASP.NET Core 中使用 Autofac,但我不想在我的应用程序中添加额外的库,因为 ASP.NET Core 已经有 DI。
所以基本上而不是:
services.AddTransient<MyService>();
services.AddTransient<MyAnotherService>();
Run Code Online (Sandbox Code Playgroud)
我更愿意做这样的事情:
services.ResolveAll();
Run Code Online (Sandbox Code Playgroud) 在我的asp.net核心应用程序中,我具有依赖项类,这些依赖项类注入了几乎所有服务。因此,我想构建一个基础服务类来获取对属性的这些依赖关系,并且我的服务继承该基础服务类。
public abstract class BaseService
{
protected Foo Foo { get; set; }
protected Bar Bar { get; set; }
public BaseService(Foo foo, Bar bar)
{
Foo = foo;
Bar = bar;
}
}
public class Service : BaseService
{
public Service(IOtherDependency otherDependency) { }
public void Method()
{
var value = Bar.value;
Foo.Do(value);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,对于给定的代码,它警告我使用提供的参数调用基本构造函数,但是它们是将在运行时注入的参数,我不希望这样做。如果添加无参数构造函数,它将不会调用我需要的参数化构造函数。
我不想在继承的服务中调用或定义任何在基本服务(Foo和Bar)中注入的类,该怎么办?
顺便说一句Foo,如果Bar类的寿命很重要,则将类作为单例注入到容器中。