【问题标题】:How to pass IOptions through Dependency injection to another Project如何通过依赖注入将 IOptions 传递给另一个项目
【发布时间】:2017-07-25 08:04:30
【问题描述】:

我有一个针对 .net 核心的 WebApplication。 我还创建了一个针对 .net 核心的类库。

我正在按照这个 Dapper 教程 Here 创建一个用户存储库

如果能够将在 WebApplication 启动时注入的选项提供到将成为数据访问层的项目中,那就太好了。

这是单独项目中用户存储库的代码。

class UsersRepository
    {
        private readonly MyOptions _options;
        private string connectionString;
        public UsersRepository(IOptions iopt/// insert Option here )
        {
            _options = iopt.Value;
            connectionString = _options.connString;
        }

        public IDbConnection Connection
        {
            get
            {
                return new SqlConnection(connectionString);
            }
        }

WebApplication Project Startup 如下所示。

public class Startup
   {

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddOptions();

        services.Configure<MyOptions>(Configuration);

        services.AddMvc();
    }

当然MyOptions 是Web 应用程序中的一个类,它只有一个属性connString

【问题讨论】:

  • 是什么阻止你这样做?拥有其他项目参考选项扩展库并使用接口,然后将存储库注册到组合根目录。
  • @Nkosi 这些实际上是你说的话:P
  • 我不太明白你最后的评论。您是否删除了之前的评论,该评论会将最后一条置于上下文中?
  • @Nkosi 这是个玩笑,意思是我不太明白你在说什么。很多我不熟悉的术语。我猜你是说创建一个只有选项的新项目,并在两个项目中引用它,但是接口、寄存器、组合根词我不明白如何完成这三个。
  • 如果您想与多个项目共享类,您需要将它们从 Web 应用程序项目中分离出来,因为您的库无法引用应用程序,因为它会导致循环依赖(库依赖于 App , App on Library),无论如何都是不好的做法,即使它有效

标签: asp.net-core .net-core


【解决方案1】:

一种可能的设计是在您的类库中为您的存储库配置创建一个新接口,并让您的 MyOptions 类型实现该接口。

例如,在您的类库中,您可以执行以下操作:

public interface IRepositoryConfig
{
    string ConnectionString { get; }
}

public class UserRepository
{
    public UserRepository(IRepositoryConfig config)
    {
       // setup
    }
}

在您的 WebAPI Startup 类中,您可以按如下方式进行连接:

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();

    services.Configure<MyOptions>(Configuration);

    services.AddMvc();

    services.AddScoped<IRepositoryConfig>(s =>
        s.GetService<IOptions<MyOptions>>().Value
    );

    services.AddScoped<UserRepository>();
}

这样做将允许您使用 Asp.Net Core 配置/选项框架,而无需直接引用您的类库中的任何 Asp.Net DLL。

【讨论】:

  • 希望我能在几小时前找到这个。这也是将选项注入库的好方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 2023-03-09
  • 2021-04-06
  • 2021-09-30
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
相关资源
最近更新 更多