- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个包含以下项目的解决方案
过去,我在完整的框架项目中使用 Unity 进行 DI。我能够将具体对象注册到可执行项目(Web 应用程序、控制台应用程序、测试应用程序)中的接口(interface)映射。
我正在尝试使用 .NET Core 实现相同的方法。我想先尝试使用 Microsoft.Extensions.DependencyInjection 库。在 ASP.NET Core 应用程序中,它运行良好。不幸的是,当我尝试将该实例与其他项目(例如 .NET Standard 库)的注册共享/引用时遇到了问题。
我的想法是将 ServiceProvider 注入(inject)到服务的构造函数中:
public class AddressService : BaseService, IAddressService
{
private readonly IServiceProvider _serviceProvider;
public AddressService(IServiceProvider serviceProvider, string userOrProcessName)
{
_serviceProvider = serviceProvider;
}
public IReadOnlyList<IState> GetAllStates()
{
_serviceProvider.GetService<IAddressRepository>();
// other logic removed
}
}
我在 Startup.ConfigureServices() 中尝试了以下内容:
services.AddTransient<IAddressService>(s => new AddressService(HttpContext.RequestServices, Environment.UserName));
我遇到的问题是我无法在 Controller 外部引用 HttpContext.RequestServices。我还没有想出另一种传递 ServiceProvider 实例的方法。
我的问题:
最佳答案
防止将 IServiceProvider
注入(inject)到您的应用程序组件中;导致 Service Locator anti-pattern .
相反,您应该仅使用构造函数注入(inject) 来构建应用程序组件。这意味着您的 AddressService
应该需要 IAddressRepository
作为构造函数参数,而不是 IServiceProvider
。例如:
public class AddressService : IAddressService
{
private readonly IAddressRepository repo;
public AddressService(IAddressRepository repo, IUserContext userContext)
{
this.repo = repo;
}
public IReadOnlyList<IState> GetAllStates()
{
// other logic removed
}
}
还要尽量避免将原始数据注入(inject)到您的构造函数中。这本身并不是一个坏习惯,但它确实使对象图的构造复杂化。相反,要么将该值包装到一个类中,以防它是一个配置值,要么将它隐藏在抽象背后(如上所示)以防它是一个运行时值。
这两种做法都简化了您的应用程序代码和 Composition Root .
例如,这将是先前 AddressService
重新设计的结果:
services.AddTransient<IAddressRepository, SqlAddressRepository>();
services.AddTransient<IAddressService, AddressService>();
services.AddScoped<IUserContext, UserContext>();
services.AddHttpContextAccessor();
在这里,UserContext
可以定义如下:
public class UserContext : IUserContext
{
private readonly IHttpContextAccessor accessor;
public UserContext(IHttpContextAccessor accessor) => this.accessor = accessor;
public string UserName => this.accessor.HttpContext.User.Identity.Name;
}
关于c# - 在项目之间共享 Microsoft.Extensions.DependencyInjection.ServiceProvider 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51087472/
在 .NET Core Console 应用程序中,我想使用内置的依赖注入(inject),包括自动处理链中的 IDisposable 对象。在 ASP.NET Core 中,对象是随每个请求创建和释
我有一个关于 Laravel 的问题。使用ServiceProviders的区别在哪里?或 Middleware在 Laravel 中? 所以我的意思是,我什么时候使用 ServiceProvider
我创建了这个提供程序: php artisan make:provider ShortcodesServiceProvider 然后我不得不删除该文件,但现在我得到了 FatalThrowableEr
我正在权衡在独立包中测试我的 ServiceProvider 的利弊。 由于 laravel 应用程序不是包的依赖项,我认为我不应该/不能编写集成测试。 但有时我在使用语句中出现拼写错误,导致我只为这
我正在使用这种方法构建服务实现: 我正在使用 Microsoft.Extensions.DependencyInjection 并尝试实现以下目标: 创建本地 ServiceCollection 并保
文件:Composer.json --------------------------------------- { "name": "laravel/laravel",
我有asp.net 核心应用程序。我将 Options 存储在 appsettings.json 文件中。我向服务注册了 Options,然后尝试在 Configure 方法中解决它。 但是服务提供商
设置:在我们公司,我尝试将基于 Ant 的 Netbeans 应用程序迁移到 Maven。我有一个基于 Maven 的 Netbeans 平台应用程序和两个包含 Netbeans 模块的 Maven
我觉得我已经搜索了整个互联网,但似乎无法弄清楚这个问题。我正在使用 Silex(最新版本),似乎无法弄清楚如何使用 Silex 的 ServiceProvider 系统返回一个类的实例以供使用。 我确
所以我有一个 Laravel 服务提供者,我想在应用它时创建一个 DEBUG 日志条目: app['log']->debug('message'); //fails too } } 如何做到这
如果您编写自己的 MarkupExtension,您可能会偶然发现 IServiceProvider serviceProvider 参数在设计时与运行时不同。例如,您无法获取 IRootObject
我为 paypal 创建了一个自定义服务提供商。当我尝试从提供者内部访问配置时,它返回 null。 下面是我写的代码。 public function register() { $this->
我正在用 Laravel 编写一个小 API,部分目的是为了学习这个框架。我想我在文档中发现了一个漏洞,但这可能是因为我不理解“Laravel 方式”来做我想做的事。 我正在编写一个 HTTP API
我正在研究 Laravel 5.2 中的 api 部分,并尝试从 Strava 获取详细信息。正如此链接中提到的 http://socialiteproviders.github.io/provide
我是 PHP 和 Laravel 的新手。我按照本教程将 reCAPTCHA 支持添加到我的 Laravel 应用程序中的页面: http://tutsnare.com/how-to-use-capt
我在 .NET 4.6.2 上有一个 Windows 服务,我在其中使用 .NET ServiceProvider(System.IServiceProvider 接口(interface))将 EF
我想改变路由的路径,但它仍然给出错误 Class HomeController does not exist 下面是我的代码 In app/Http/routes.php page Route::ge
有什么好办法可以拿到ServiceProvider在 AddOpenIdConnect , 或 稍后在我们完全设置 DI 容器的地方配置 ClientSecret? (例如在 Configure(IA
我编写了一个 aspnet core 控制台应用程序,该应用程序将 Entity Framework Core 与 SQL Server 结合使用。该应用程序有多个 Azure 服务总线队列客户端,我
friend 们大家好,我是 Laravel 框架的新手。 我在应用程序文件夹中创建模块目录。 然后我还在模块目录中创建 ServiceProvider.php 文件。 我的文件结构如下。 app\m
我是一名优秀的程序员,十分优秀!