C# ch与win表单兼容。参考我的.net core 2.2库作品,这对我设置新项目非常有帮助。:)我并不反对类库中的DI方法。肯定是要走的路。但就访问层而言,我的信念是静态的,将依赖关系注入到方法级别。不是构造函数。我意识到这是一个由来已久的论点,没有正确的

C# ch与win表单兼容。参考我的.net core 2.2库作品,这对我设置新项目非常有帮助。:)我并不反对类库中的DI方法。肯定是要走的路。但就访问层而言,我的信念是静态的,将依赖关系注入到方法级别。不是构造函数。我意识到这是一个由来已久的论点,没有正确的,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,ch与win表单兼容。参考我的.net core 2.2库作品,这对我设置新项目非常有帮助。:)我并不反对类库中的DI方法。肯定是要走的路。但就访问层而言,我的信念是静态的,将依赖关系注入到方法级别。不是构造函数。我意识到这是一个由来已久的论点,没有正确的答案,但我倾向于偏向静态方面。@PimBrouwers如果您指的是在构造函数级别注入连接字符串,那么这不是个人偏好。这就是.NET Core现在处理将配置设置导入应用程序的方式。他们推荐您在这里看到的选项模式,而不是通过静态配置类访问选项的旧方


ch与win表单兼容。参考我的.net core 2.2库作品,这对我设置新项目非常有帮助。:)我并不反对类库中的DI方法。肯定是要走的路。但就访问层而言,我的信念是静态的,将依赖关系注入到方法级别。不是构造函数。我意识到这是一个由来已久的论点,没有正确的答案,但我倾向于偏向静态方面。@PimBrouwers如果您指的是在构造函数级别注入连接字符串,那么这不是个人偏好。这就是.NET Core现在处理将配置设置导入应用程序的方式。他们推荐您在这里看到的选项模式,而不是通过静态配置类访问选项的旧方法。@McGaz,这与我的答案根本不符。再看看我的代码。1) 这里唯一的“额外”代码是向appsettings.json添加设置,创建一个类来匹配这些设置,并使用选项模式注入设置(在.NET Core 1.0中的标准实践)。2) 库在初始化时只需要一次连接字符串(这是无法避免的。您将始终需要知道从何处读取数据)。认真地说,再看一遍代码并将其付诸实践。这是非常基本的东西,也是正确的方法。我想这应该是选择的答案。它不仅得到了很好的解释和架构,还遵循了.NET核心提出的最佳实践@史蒂芬波特对此非常感谢。我没有看到关于如何为外部库配置IOption的示例。现在我已经实现了它,这似乎很明显,但我不得不仔细阅读你的答案,以便省钱:)
{
  "emailAddress":"someone@somewhere.com"
}
using Microsoft.Framework.ConfigurationModel;
public class MyClass
{
  public string GetEmailAddress()
  {
//    return ConfigurationManager.AppSettings["emailAddress"];  This is the approach I had been using since .NET 2.0
    return ?;  // What goes here?
  }
}
var configuration = new Configuration();
configuration.AddJsonFile("config.json");
var emailAddress = configuration.Get("emailAddress");
public class LibraryClassThatNeedsConnectionString
{
    private string connectionString;

    public LibraryClassThatNeedsConnectionString(string connectionString)
    {
        this.connectionString = connectionString;
    }

    public string ReadTheDatabase(int somePrimaryKeyIdToRead)
    {
        var result = string.Empty;

        // Read your database and set result

        return result;
    }
}
{
  "DatabaseSettings": {
    "ConnectionString": "MySuperCoolConnectionStringWouldGoHere"
  }
}
public class DatabaseSettings
{
    public string ConnectionString { get; set; }
}
public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        Configuration = new ConfigurationBuilder()
                        .SetBasePath(env.ContentRootPath)
                        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                        .AddEnvironmentVariables()
                        .Build();
    }

    public IConfigurationRoot Configuration { get; }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        // Setup logging
        // Configure app

    }

    public void ConfigureServices(IServiceCollection services)
    {
        // Configure services
        services.Configure<DatabaseSettings>(Configuration.GetSection("DatabaseSettings"));
        services.AddOptions();

        // Register our class that reads the DB into the DI framework
        services.AddTransient<IInterfaceForClass, ClassThatNeedsToReadDatabaseUsingLibrary>();
    }
}
public interface IInterfaceForClass
{
    string ReadDatabaseUsingClassLibrary(int somePrimaryKeyIdToRead);
}

public class ClassThatNeedsToReadDatabaseUsingLibrary : IInterfaceForClass
{
    private DatabaseSettings dbSettings;
    private LibraryClassThatNeedsConnectionString libraryClassThatNeedsConnectionString;

    public ClassThatNeedsToReadDatabaseUsingLibrary(IOptions<DatabaseSettings> dbOptions)
    {
        this.dbSettings = dbOptions.Value;
        this.libraryClassThatNeedsConnectionString = new LibraryClassThatNeedsConnectionString(this.dbSettings.ConnectionString);
    }

    public string ReadDatabaseUsingClassLibrary(int somePrimaryKeyIdToRead)
    {
        return this.libraryClassThatNeedsConnectionString.ReadTheDatabase(somePrimaryKeyIdToRead);
    }
}
public class SomeController : Controller
{
    private readonly classThatReadsFromDb;

    public SomeController(IInterfaceForClass classThatReadsFromDb)
    {
        this.classThatReadsFromDb = classThatReadsFromDb;
    }

    // Controller methods
}
<Target Name="AddConfig" AfterTargets="AfterBuild">
    <Copy SourceFiles="config.json" DestinationFolder="$(OutDir)" />
</Target>
using Microsoft.Framework.ConfigurationModel;
using Microsoft.Extensions.Configuration;
using System;

public class MyClass {
    public string GetEmailAddress() {
        //For example purpose only, try to move this to a right place like configuration manager class
        string basePath= System.AppContext.BaseDirectory;
        IConfigurationRoot configuration= new ConfigurationBuilder()
            .SetBasePath(basePath)
            .AddJsonFile("config.json")
            .Build();

        return configuration.Get("emailAddress");
    }
}
 public static class Config
  {
    private static IConfiguration configuration;
    static Config()
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
        configuration = builder.Build();
    }

    public static string Get(string name)
    {
        string appSettings = configuration[name];
        return appSettings;
    }
}
public class AppSettings
{
    public string MyConnectionString { get; set; }
}
"AppSettings": {
"MyConnectionString": "yourconnectionstring",
// This method gets called by the runtime. Use this method to add services to the container
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        // inject App setting
        var appSettingSection = Configuration.GetSection("AppSettings");
        services.Configure<AppSettings>(appSettingSection);
        var appsetting = appSettingSection.Get<AppSettings>();
        // set connection string in .csproject properties.
        classLibraryProject.Properties.Settings.Default.Properties["MyConnectionString"].DefaultValue = appsetting.MyconnectionString;


    }
{
"AppSettings": {
    "FTPLocation": "\\\\hostname\\\\c$\\\\FTPMainFolder\\\\ftpFolder\\\\Test\\",
    "FTPUri": "ftp://hostname.domainname.com/foldername/",
    "CSVFileName": "Test Load Planning.csv"  
                },
"ConnectionStrings": 
 {
 "AppDbConnString": "Server=sqlserverhostname.domainname.com;Database=DBName;Trusted_Connection=True; MultipleActiveResultSets=true"   },
 "ADSecurityGroups": { "UserSecurityGroups": "AD-DL-GROUP-NAME;AD-DL-GROUP2-NAME"},
 "Logging": 
  {
    "LogLevel": {
        "Default": "Warning"    
       }  
   }
}
using Microsoft.Extensions.Configuration;
public class LoginController : BaseController
{
    
    private readonly ILoginDataServices _loginDataServices;
    private readonly IConfiguration _configuration;
    public IActionResult Index()
    {
        return View();
    }


    public LoginController(ILoginDataServices loginDataServices, IConfiguration configuration)
    {
       
            _loginDataServices = loginDataServices;
            _configuration = configuration;
        
    }


    public bool CheckLogin(string userName, string password)
    {
        if (CheckIfValidEmployee(userName))
        {
            //////checking code here....
        }
        else
        {
            return false;
        }
    }

    bool CheckIfValidEmployee(string userName)
    {

        var securityGroups = _configuration.GetSection("ADSecurityGroups:UserSecurityGroups").Value.Split(';');
         Console.WriteLine(securityGroups);
       ////////Code to check user exists into security group or not using variable value
     }