如何为PerRequestLifetimeManager定义别名,得到"无法解析"错误

时间:2014-08-04 19:19:07

标签: unity-container

我正在尝试为PerRequestLifetimeManager定义一个别名,并在容器配置部分使用它,但我不断收到此错误:“无法解析类型名称或别名PerRequestLifetimeManager。请检查您的配置文件并验证这一点类型名称。“我错过了什么?其他2个别名工作正常,但它们不在同一个dll中......

      <!-- not working -->
      <typeAlias alias="request" type="Microsoft.Practices.Unity.PerRequestLifetimeManager ,          Microsoft.Practices.Unity.Mvc"/>

      <!-- working -->
      <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,                      Microsoft.Practices.Unity"/>
      <typeAlias alias="external" type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager,                      Microsoft.Practices.Unity"/>

更新

以下是我的Unity配置部分。我收到“无法解析类型名称或别名请求”。错误。

 <unity>
    <typeAliases>
      <!-- Lifetime manager types -->
      <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,                      Microsoft.Practices.Unity"/>
      <typeAlias alias="external" type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager,                      Microsoft.Practices.Unity"/>
      <typeAlias alias="request" type="Microsoft.Practices.Unity.PerRequestLifetimeManager ,          Microsoft.Practices.Unity.Mvc"/>
   </typeAliases>
    <containers>
      <container name="main">
        <types>
          <type type="IProvider" mapTo="ConcreteProvider">
            <lifetime type="request"/>
          </type>
        </types>
    </container>
     </containers>
</unity>

2 个答案:

答案 0 :(得分:1)

只需将一些非常简单的样本放在一起,下面的设置就适合我。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration
   .UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <alias alias="ILogger" type="ConsoleApplication2.ILogger, ConsoleApplication2" />
    <alias alias="request" type="Microsoft.Practices.Unity.PerRequestLifetimeManager,
     Microsoft.Practices.Unity.Mvc" />
    <container name="MyContainer">
      <register type="ILogger" mapTo="ConsoleApplication2.FileLogger,
     ConsoleApplication2" />
    </container>
  </unity>
</configuration>

更新6/8/2014以获取以下评论。

一个。创建一个新项目i。 C#Console App .NET v 4.5 B.安装包Unity C.安装包Unity.Mvc

Package.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="CommonServiceLocator" version="1.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.Mvc" version="4.0.30506.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebPages" version="2.0.30506.0" targetFramework="net45" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
  <package id="Unity" version="3.5.1404.0" targetFramework="net45" />
  <package id="Unity.Mvc" version="3.5.1404.0" targetFramework="net45" />
  <package id="WebActivatorEx" version="2.0.5" targetFramework="net45" />
</packages>

使用配置文件。

using Microsoft.Practices.Unity.Configuration;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            IUnityContainer container = new UnityContainer();
            container.LoadConfiguration("MyContainer");
            var logger = container.Resolve<ILogger>();
            Console.Read();
        }
    }

    public interface ILogger
    {
    }

    public class FileLogger : ILogger
    {
    }
}

答案 1 :(得分:0)

谢谢Spock。根据您的回答和评论,我能够完成实施。我试图在配置文件中注册 DbContext 并选择 LifetimeManager = PerRequestLifetimeManager 。最新的nuget软件包中的Unity软件包的名称空间已更改。

  • Unity v5.8.6
  • Unity.Mvc v5.0.13

这是我的配置文件的样子

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

<alias alias="PerRequest" type="Unity.AspNet.Mvc.PerRequestLifetimeManager, Unity.Mvc" />

在容器内,这是我注册dbcontext的方式

<register  type ="MyNameSpace.DbEntities, AssemblyName" mapTo="MyNameSpace.DbEntities, AssemblyName">
      <lifetime type="PerRequest"/>
</register>

谢谢。