【问题标题】:How can we resolve dependency with configuration file settings我们如何通过配置文件设置解决依赖关系
【发布时间】:2019-08-20 09:39:54
【问题描述】:

我对依赖注入解析器技术主题有点陌生。我可以知道我们如何通过配置文件部分解决依赖关系吗?下面是我的类和接口以及配置文件。

我确信缺少部分代码/设置。你能帮我解决这个问题吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UnityConfiguration_Testing
{
    public interface IUserAuthentication
    {
        string Authenticate(string username, string password);
        string GetUserRole(string username);
    }
}

public class CloudAppAuthetication: IUserAuthentication
{
    public string Authenticate(string username, string password)
    {
        return "This Authenticate method executed from cloud class";//Jwt token based authentication logic should be there
    }

    public string GetUserRole(string username)
    {
        return "This GetUserRole method executed from cloud class";//New logic to user management api call
    }
}

public class StandaloneAppAuthetication : IUserAuthentication
{
      public string Authenticate(string username, string password)
      {
          return "This Authenticate method executed from standalone class";//current logic should be here
      }

      public string GetUserRole(string username)
      {
           return "This GetUserRole method executed from standalone class";//current logic should be here
      }
  }

接口方法的控制台应用调用:

using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UnityConfiguration_Testing
{
    class Program
    {
        static void Main(string[] args)
        {
            IUnityContainer container = new UnityContainer();
            container.LoadConfiguration("TestContainer");
            IUserAuthentication _userAuthentication = null;
            string validatedUser = _userAuthentication.Authenticate("testuser@user.com", "testpassword");
            string validatedUserRole = _userAuthentication.GetUserRole("testuser@user.com");
        }
    }
}

我的控制台应用程序的 App.config 文件是:

  <?xml version="1.0" encoding="utf-8"?>
  <configuration>
    <configSections>
       <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
    </configSections>
    <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
      <container name="TestContainer">
        <register type="UnityConfiguration_Testing.IUserAuthentication,UnityConfiguration_Testing" mapTo="UnityConfiguration_Testing.StandaloneAppAuthetication,UnityConfiguration_Testing" />
      </container>
    </unity>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>

【问题讨论】:

  • 您评估过工厂模式吗?或者,如果您使用 DI,您可以评估一个基于 web.config 条目更改 DI 注册的案例?

标签: c# asp.net-core-mvc asp.net-core-webapi


【解决方案1】:

控制权反转是您想要的。 有许多。例如 Autofac。他们能够根据您在配置文件中的配置注册接口的实现,或者您可以在运行时配置它。

【讨论】:

  • 对不起亚当。我真的不知道为什么我点击了你的答案。其实这是正确的做法。并且运作良好。只是为了其他原因,解决方案在这里:stackoverflow.com/questions/51399322/…
【解决方案2】:

如果我正确理解了这个问题,这大致就是您要找的内容。

using System;
using System.Reflection;

public class Program
{
    public static void Main()
    {
        Type t = Type.GetType("Second"); //get class name from config here
         MethodInfo method 
             = t.GetMethod("Hello", BindingFlags.Static | BindingFlags.Public); // get method by name here

        Console.WriteLine(method.Invoke(null,null));
    }
}

public static class First
{
    public static string Hello(){
    return "hello"; 
    }
}
public static class Second 
{
    public static string Hello(){
    return "Hello World";   
    }
}

这将允许您获取由您可以从配置文件中获取的名称定义的类和方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多