Asp.net Core 2 - 如何在 Asp.net Core 2.0中使用ServiceLocator



我的Startup是这样的:

public void ConfigureServices(IServiceCollection services)
{
    // code here 
    Bootstraper.Setup(services);
}

我的Bootstraper课是这样的:

public static partial class Bootstraper
{
    // code here 
    public static IServiceCollection CurrentServiceCollection { get;set;}
    public static IServiceProvider CurrentServiceProvider
    {
        get { return CurrentServiceCollection.BuildServiceProvider(); }
    }    
    public static void Setup(IServiceCollection serviceCollection)
    {
        // code here 
        SetupLog();
        InitializeCulture();
        InitializeDbContexts();
        RegisterDataModelRepositories();
    }

这是我RegisterDataModelRepositories()的内容:

CurrentServiceCollection.AddTransient<IDefAccidentGroupRepository>(p => new DefAccidentGroupRepository(ApplicationMainContextId));
CurrentServiceCollection.AddTransient<IDefGenderRepository>(p => new DefGenderRepository(ApplicationMainContextId));

简而言之:我只是希望能够在我的方法中使用服务定位器,而无需解决类构造函数中的依赖关系......有什么办法吗....

依赖注入也可以按操作完成。

引用依赖注入到控制器中:使用 FromServices 的操作注入

有时,控制器中的多个操作不需要服务。在这种情况下,将服务作为参数注入操作方法可能是有意义的。这是通过使用属性标记参数来完成的[FromServices]

public IActionResult SomeAction([FromServices] IReportService reports) {
    //...use the report service for this action only
    return View();
}

只需确保所需的服务已注册到服务集合。

services.AddTransient<IDefAccidentGroupRepository>(p => new DefAccidentGroupRepository(ApplicationMainContextId));
services.AddTransient<IDefGenderRepository>(p => new DefGenderRepository(ApplicationMainContextId));
services.AddTransient<IReportService, ReportService>().

好吧,感谢您的帮助...有一个更简单更好的方法,我只需要添加另一个使用这些存储库的服务,然后在我的控制器中解析该服务,让 Asp.net Core 2.0 DI 为我解决问题......

public interface IActionService 
{
   IRepositoryA repA {get;set;}
   IRepositoryB repB { get;set;}
   DoTaskX();
   DoTaskY();
}

那么在我的行动服务中:

public class ActionService : IActionService 
{
   public IRepositoryA repA {get;set;}
   public IRepositoryB repB { get;set;}
   public ActionService (IRepositoryA rep_a , IRepositoryB rep_b ) {
      repA = rep_a;
      repB = rep_b;
   }
   DoTaskX(){
    // do task using repository A and B
   }
}

然后我在启动中注册 IActionService.cs并在我的 ActionController 中解决它,生活变得更容易,代码变得更干净......

解决方案很容易,但我必须改变我的心态来解决问题......

最新更新