2

我正在使用 Unity Application Block 加载我的依赖项,我遇到的一个问题是,当我的所有依赖项都加载时,它的行为异常。

我有一个使用构造函数注入采用业务接口的服务,并且该业务接口采用存储库接口作为构造函数注入。我遇到的问题是,当我从数据库加载用户详细信息时,字段值总是相同的(即使我在数据库中手动更改了它们)。因此我认为这是因为每次打开服务时它都使用相同的实例 EntityFramework 上下文实例。

我可以让实体框架加载正确详细信息的唯一方法是回收 IIS。

有没有一种方法可以强制 Unity 为其依赖项创建新的对象实例,并在 WCF 请求完成时强制它们被释放?我曾尝试使用瞬态生命周期管理器,但这并不能解决问题。

代码:

public class UserService : IUserService
{
    private IUserAdmin _UserBusiness { get; set; }

    public UserService()
    {

    }

    [InjectionConstructor]
    public UserService(IUserAdmin userBusiness)
        : this()
    {
        this._UserBusiness = userBusiness;
    }
}

public class UserAdmin : BusinessBase, IUserAdmin
{
    private IRepository<DBUserAccount> _UserRepository { get; set; }

    [InjectionConstructor]
    public UserAdmin(IRepository<DBUserAccount> userRepository)
    {
        this._UserRepository = userRepository;
    }
}

public class GenericRepository<T> : IDisposable, IRepository<T> where T : class, new()
{
    private Entities _Context;

    private ObjectSet<T> _ObjectSet;

    public GenericRepository()
    {
        this._Context = new Entities();
        this._ObjectSet = this._Context.CreateObjectSet<T>();
    }
}

统一配置:

<register type="Services.Contracts.IUserService, Server.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be"
            mapTo="Services.Implementations.UserService, Server.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be">
    <lifetime type="transient"/>
  </register>
<register type="Server.Business.Users.IUserAdmin, Server.Business, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be"
            mapTo="Server.Business.Users.UserAdmin, Server.Business, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be">
    <lifetime type="transient"/>
  </register>
<register type="Server.DataLogic.IRepository`1[[Server.DataModels.DBUserAccount, Server.DataModels, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be]], Server.DataLogic, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be"
            mapTo="Server.DataLogic.GenericRepository`1[[Server.DataModels.DBUserAccount, Server.DataModels, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be]], Server.DataLogic, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be">
    <lifetime type="transient"/>
  </register>
4

1 回答 1

0

您似乎还没有在应用程序中实现工作单元模式。Unity 配置看起来正确,但似乎您的更改没有被提交。查看EntityFramework 团队的这篇博文,了解如何实现它。您还应该确保您的实现在提交此 SO 问题和答案中讨论的工作单元时正确处理 EntityFramework 上下文

于 2012-08-21T14:09:29.383 回答