您应该如何根据依赖关系树来处理.net核心服务?

时间:2018-07-16 18:48:02

标签: c# asp.net-core dependency-injection

我现在在我的注册服务部分中使用它。这里的问题是我的服务具有自己的依赖关系,也许那些服务将具有依赖关系。我看不到如何解决这个问题。例如,我的位置服务需要http客户端,记录器和两个不同的存储库。我期望已经将这4个依赖项注册为服务,这会自行解决。任何建议将不胜感激。

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        // db related
        var connectionString = Configuration.GetConnectionString("VoloDataBaseConnectionString");
        var dbContext = new DbContext(connectionString);
        services.AddSingleton<IDbContext>(dbContext);
        services.AddScoped(typeof(Repository<>), typeof(Repository<>));

        // utilities
        services.AddSingleton(new HttpClient());
        services.AddSingleton(new Logger(dbContext));

        // bll services
        services.AddSingleton(
            new LocationService(
                new HttpClient(),
                new Logger(dbContext),
                new Repository<Country>(dbContext),
                new Repository<Location>(dbContext)
            )
        );
    }

1 个答案:

答案 0 :(得分:1)

  

我希望已经将这4个依赖项注册为服务,这会自行解决。

它将自理。您只需要利用容器的自动装配功能即可:

services.AddScoped<LocationService>();

请注意,为了防止Captive Dependencies,您应确保组件不依赖其他生活方式较短的组件。例如,不要让Singleton组件依赖于Scoped组件。因此,LocationService不应 注册为Singleton,而应注册为ScopedTransient