【问题标题】:Unity framework in .net core.net 核心中的 Unity 框架
【发布时间】:2019-05-02 21:19:40
【问题描述】:

我是 .net 核心的新手。需要帮助建立统一框架。这是我尝试过的。

我添加了对 System.Configuration.ConfigurationManager .net 标准 V2.0 的引用

然后创建 app.config

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <!--In older version, Microsoft.Practices.Unity.Configuration.dll is part of older version (around 3.5.1404). In newer version,
    Microsoft.Practices.Unity.Configuration.UnityConfigurationSection class is moved to Unity.Configuration.dll.-->
    <!--<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>-->
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
  </configSections>
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <!--Old syntax-->
    <!--<typeAliases>
      <typeAlias alias="IDBAccess" type="Interfaces.IDataProvider, Interfaces" />
      <typeAlias alias="SQLDataAccess" type="SQLDataProvider.DataProvider, SQLDataProvider" />
    </typeAliases>-->
    <!--New syntax supported in newer versions. So if above syntax does not work then try below one-->
    <alias alias="IDBAccess" type="Interfaces.IDataProvider, Interfaces" />
    <alias alias="SQLDataAccess" type="SQLDataProvider.DataProvider, SQLDataProvider" />
    <alias alias="OracleDataAccess" type="OracleDataProvider.DataProvider, OracleDataProvider" />
    <containers>
      <container name="DataAccessProvider">
        <register type="IDBAccess" mapTo="SQLDataAccess"/>
        <register type="IDBAccess" mapTo="SQLDataAccess" name="SQLDataAccess" />
        <register type="IDBAccess" mapTo="OracleDataAccess" name="OracleDataAccess" />
      </container>
    </containers>
  </unity>
</configuration>

在课堂上我尝试阅读配置,但得到 NULL。

UnityConfigurationSection section =


(UnityConfigurationSection)ConfigurationManager.GetSection("unity");

【问题讨论】:

  • 你为什么使用app.config而不是普通的json配置?
  • 为什么需要 Unity?
  • 我在 Asp.Net core 中使用 Unity,因为嵌入式 DI 太简单了。
  • 出于好奇,Unity 做了哪些嵌入式 DI 无法做到的事情?另外,您使用什么特定的 NuGet 包和版本将统一引入您的项目?
  • 我问的原因是您可以使用Unity.Microsoft.DependencyInjection,这将允许您使用UnityConfigurationOptions 像任何其他.net Core 配置对象一样设置普通JSON。

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


【解决方案1】:

在 app.config 中你可以试试这个

<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection"/>

代替这一行

<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>

【讨论】:

    【解决方案2】:

    如果您指的是 Unity DI 容器框架,则不需要设置它,因为 dotnet core 带有它自己的 IoC DI 容器。 dotnet 核心也使用 appSettings.json 配置文件。 在 Startup.cs 中应该有这个方法:

    public void ConfigureServices(IServiceCollection services) 
    {
    
    }
    

    您可以使用服务对象配置您的依赖项,如下所示:

    services.AddSingleton<IContract, Contract>();
    

    关于如何配置依赖项还有其他选项,我刚刚介绍了单例,但你可以从这里开始。

    检查这一点的最简单方法是启动一个新项目:

    dotnet new mvc -n testProj
    

    然后检查 Startup.cs 文件,为其添加一个接口、一个实现,然后将其注册到 IServiceCollection 实例中。

    【讨论】:

    • 看,通过拥有一个单独的 .config 文件或 json 文件使我们能够不添加对实现库的引用。 asp.net项目只能依赖Interfaces.csproj项目来进行有依赖的功能。但是没有配置文件,我还需要添加对实现库的引用。这可能会在构建时导致循环依赖问题。另一种方法是手动将这些实现 dll 复制到 asp.net 应用程序的“调试”目录,以允许统一容器自动加载来自同一目录的 dll 的依赖项。
    【解决方案3】:

    这是我最终实现的方式。 在启动类中我配置了依赖项

     public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            services.AddScoped<IRepositoryFactory, RepositoryFactory>();
            services.AddScoped<IMapperFactory, MapperFactory>();
            services.AddScoped<ITestService, testtService>();
    
    
           // services.AddScoped<IMapperFactory, MapperFactory>();
        }
    

    这是解决它的代码。使用 DependencyFactory.Resolve();

    public DependencyFactory(IServiceCollection services)
        {
            _container=services;
        }
     public static T Resolve<T>()
        {
            T ret = default(T);
            var provider = _container.BuildServiceProvider();
    
            if (provider.GetService<T>() !=null)
            {
                ret = (T)provider.GetService<T>();
            }
    
            return ret;
        }
    

    【讨论】:

    • 您不需要自己的 DependencyResolver。 dotnet 核心有它自己的“解析器”,您可以使用它来明确获取您的服务,您可以使用 IServiceProvider 实例。您可以在这里找到更多信息:docs.microsoft.com/en-us/dotnet/api/… 至于构造函数注入,这一切都是在您在 ConfigureServices 方法中注册依赖项之后设置的。
    • 我有动态的类名,我需要解决。
    最近更新 更多