如何通过依赖注入将IOptions传递到另一个项目

chr*_*ark 1 .net-core asp.net-core

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

我正在按照此Dapper教程在此处创建用户存储库

能够提供在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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

WebApplication项目启动看起来如下。

public class Startup
   {

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

        services.Configure<MyOptions>(Configuration);

        services.AddMvc();
    }
Run Code Online (Sandbox Code Playgroud)

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

dba*_*lia 5

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

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

public interface IRepositoryConfig
{
    string ConnectionString { get; }
}

public class UserRepository
{
    public UserRepository(IRepositoryConfig config)
    {
       // setup
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的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>();
}
Run Code Online (Sandbox Code Playgroud)

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

  • 希望我在几个小时前找到了。这也是将选项注入库的好方法。 (2认同)