我有以下内容,它们被打包成一个纽吉特包裹
// Internal implementation
internal interface ICoreService
{
int GetSomething();
}
internal class CoreService : ICoreService
{
int ICoreService.GetSomething()
{
return 2;
}
}
// Exposed Service
public interface IExposedService
{
int GetNumber();
}
public class ExposedService: IExposedService
{
private readonly ICoreService _coreService;
internal ExposedService(ICoreService coreService)
{
_coreService = coreService;
}
public int GetNumber()
{
return _coreService.GetSomething();
}
}
IServiceCollection有两个扩展方法
public static IServiceCollection Initialize(this IServiceCollection services)
{
services.AddSingleton<ICoreService, CoreService>();
return services;
}
public static IServiceCollection AddExposedService(this IServiceCollection services)
{
services.AddTransient<IExposedService, ExposedService>();
return services;
}
它们被链接在一起,例如:builder.Services.Initialize().AddExposedService()
.
现在的问题是,由于ICoreService
是内部的,当将这个包添加到另一个应用程序时,DI无法解析ICoreService并将其注入ExposedService.
但如果我做了以下几点,它就可以正常工作了:
public static IServiceCollection Initialize(this IServiceCollection services)
{
services.AddSingleton<ICoreService, CoreService>();
return services;
}
public static IServiceCollection AddExposedService(this IServiceCollection services)
{
services.AddTransient<IExposedService>(sp =>
{
var coreService = sp.GetRequiredService<ICoreService>();
return new ExposedService(coreService)
});
return services;
}
这样做的目的是隐藏CoreService,以便在添加包时不能将ICoreService注入任何您想要的东西.
问题是:这种解决ICoreService并使用穷人的DI的方法是常见的吗?如果不是,你还能怎么做呢?此外,在幕后发生了什么,使得这种方法能够奏效?