Entity framework 具有实体框架的Unity 2.0 IOC

Entity framework 具有实体框架的Unity 2.0 IOC,entity-framework,inversion-of-control,unity-container,Entity Framework,Inversion Of Control,Unity Container,我在项目中使用Unity 2.0和asp.net mvc3。当我尝试在我的存储库类中配置TestEntities:ObjectContext时,会引发异常 public class UserRepository:IUser { //TestEntities ctx = new TestEntities(); [Dependency] public TestEntities ctx { get; set; } //... } 这是异常消息: 类型TestEntit

我在项目中使用Unity 2.0和asp.net mvc3。当我尝试在我的
存储库
类中配置
TestEntities:ObjectContext
时,会引发异常

public class UserRepository:IUser
{
    //TestEntities ctx = new TestEntities();
    [Dependency]
    public TestEntities ctx { get; set; }
    //...
}
这是异常消息:

类型TestEntities有多个长度为1的构造函数。无法消除歧义

XML配置:

<?xml version="1.0" encoding="utf-8" ?>
<unity xmlns="schemas.microsoft.com/practices/2010/unity">
    <container>
        <register type="DomainModel.Entity.TestEntities, DomainModel"
                  mapTo="DomainModel.Entity.TestEntities, DomainModel">
            <lifetime type="perthread"/>
        </register>
        <register type="DomainModel.Abstract.IUser, DomainModel"
                  mapTo="DomainModel.Concrete.UserRepository, DomainModel">
            <lifetime type="perthread"/>
        </register>
    </container>
</unity>

这是完全不正确的配置。首先,您使用的是每线程生存期。每个线程的生命周期适用于您自己控制线程的场景,但在ASP.NET MVC中您没有这种控制。ASP.NET MVC在内部使用线程池,以便在后续请求中重用线程=您的上下文将在请求中重用,这将导致您失败。另一个问题是上下文的每个线程生存期,所以除非您自己处理它(如果您不控制线程生存期,这是非常困难的),否则您的应用程序将足以承受大内存泄漏

您必须使用不同的生存期管理:

  • 每解析:每次在容器上调用
    resolve
    时都会创建新实例,但在依赖层次结构的情况下,所有注入都将使用同一实例。你必须自己处理
  • 瞬态:这将在每次调用
    Resolve
    时创建新实例。若在依赖关系层次结构中多次需要实例,它将为每次注入创建一个新实例。你必须自己处理
  • 层次:必须为此子容器上的每个请求处理和解析实例创建新的子容器。每次对该子容器实例调用
    Resolve
    时,都将使用相同的实例。完成请求后,您必须处理Subcainer,并且所有具有分层生存期的实例也将被处理
  • 定制的生命周期管理器(如,但具有正确的依赖项注入配置)应该不需要这样做,并且每个解析或分层管理器应该解决您的所有需求
更多关于不同生命周期管理器的信息,请参阅

解决您的
测试问题。默认情况下,Unity将尝试使用参数最多的构造函数,并使用依赖项注入解析这些参数。如果它将找到多个这样的构造函数,它将抛出此错误,因为它不知道选择哪一个。即使只有一个,您也会得到错误,因为这种构造函数的依赖关系将不会被解析。必须明确地告诉Unity要调用哪个构造函数。这将强制Unity使用默认构造函数:

<register type="DomainModel.Entity.TestEntities, DomainModel"
          mapTo="DomainModel.Entity.TestEntities, DomainModel">
    <lifetime type="perresolve"/>
    <constructor />
</register>

这是完全不正确的配置。首先,您使用的是每线程生存期。每个线程的生命周期适用于您自己控制线程的场景,但在ASP.NET MVC中您没有这种控制。ASP.NET MVC在内部使用线程池,以便在后续请求中重用线程=您的上下文将在请求中重用,这将导致您失败。另一个问题是上下文的每个线程生存期,所以除非您自己处理它(如果您不控制线程生存期,这是非常困难的),否则您的应用程序将足以承受大内存泄漏

您必须使用不同的生存期管理:

  • 每解析:每次在容器上调用
    resolve
    时都会创建新实例,但在依赖层次结构的情况下,所有注入都将使用同一实例。你必须自己处理
  • 瞬态:这将在每次调用
    Resolve
    时创建新实例。若在依赖关系层次结构中多次需要实例,它将为每次注入创建一个新实例。你必须自己处理
  • 层次:必须为此子容器上的每个请求处理和解析实例创建新的子容器。每次对该子容器实例调用
    Resolve
    时,都将使用相同的实例。完成请求后,您必须处理Subcainer,并且所有具有分层生存期的实例也将被处理
  • 定制的生命周期管理器(如,但具有正确的依赖项注入配置)应该不需要这样做,并且每个解析或分层管理器应该解决您的所有需求
更多关于不同生命周期管理器的信息,请参阅

解决您的
测试问题。默认情况下,Unity将尝试使用参数最多的构造函数,并使用依赖项注入解析这些参数。如果它将找到多个这样的构造函数,它将抛出此错误,因为它不知道选择哪一个。即使只有一个,您也会得到错误,因为这种构造函数的依赖关系将不会被解析。必须明确地告诉Unity要调用哪个构造函数。这将强制Unity使用默认构造函数:

<register type="DomainModel.Entity.TestEntities, DomainModel"
          mapTo="DomainModel.Entity.TestEntities, DomainModel">
    <lifetime type="perresolve"/>
    <constructor />
</register>


非常感谢您。你能给我更多关于“处理上下文处理”的信息吗?一旦你不再需要它,你只需要处理上下文,因为上下文应该只用于单个逻辑操作(工作单元),它可能非常频繁。例如,在web应用程序或web服务中,每个请求通常只有一个上下文。在表单应用程序中,每个表单或演示者可以有一个上下文。谢谢。如果你有时间再问一个问题,我真的很感激:非常感谢。你能给我更多关于“处理上下文处理”的信息吗?一旦你不再需要它,你只需要处理上下文,因为上下文应该只用于单个逻辑操作(工作单元),它可能非常频繁。例如,在web应用程序或web服务中,您通常