使用Unity DI时如何使用Entity Framework添加Non DI服务

时间:2017-09-11 16:56:36

标签: entity-framework asp.net-web-api unity-container

这显然与Multithreading issue不同。

对我的所有服务使用Unity和依赖注入(DI),并使用似乎已初始化并正常工作的实体框架上下文。

目前使用.net 4.5与mvc和Unity.WebApi以及实体框架6.0.0.0。

我想知道是否有可能在此模型中保留服务或在DI之外使用,并且如果可能的话,能够在持久服务中关闭并重新初始化实体框架。

当我尝试通过堆栈类持久保存服务时出现此错误,因此其性能将非常快b / c我会更频繁地使用。

The Error message I am getting is: Error Message: The underlying provider failed on Open. - The connection was not closed. The connection's current state is connecting.(   at System.Data.Entity.Core.EntityClient.EntityConnection.Open()

目的是仅检索单个实体,并使其与依赖注入版本相比加载速度非常快,并通过服务公开结果。该实体绑定到sql表以进行日志记录。

以下是我试图坚持服务的原因代码摘要:

    using System;
using System.Linq;

using Davinci.Models;

namespace Services.Services
{
    public interface ILogService
    {
        void SaveLog(UserLog log);
        UserLog RetreiveLog(DateTime dateTime);
    }

public class LogService : ILogService
{
    private DavinciEntities _DavinciEntities;

    public LogService(DavinciEntities context)
    {
        _DavinciEntities = context;
    }

    private void SaveLog(UserLog log)
    {
        _DavinciEntities.UserLogs.Add(log);
        _DavinciEntities.SaveChanges();
    }

    public UserLog RetreiveLog(DateTime dateTime)
    {
        return _DavinciEntities.UserLogs.Where(m => m.LogTime.ToShortDateString() == dateTime.ToShortDateString()).FirstOrDefault();
    }
}

public static class PersistService
{
    public static UserLogService userLogService {get; set;}
    public static void PersistUserLog(UserLogService service)
    {
        IUserLogService UserLogService;
        if (UserAccessLog == null)
        {
            UserLogService = (UserLogService)context.Configuration.DependencyResolver.GetService(typeof(UserLogService));
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

由于我已经使用我的实体的DBContext存储了我的服务副本,因此它失败了,因为它被多个线程使用。解决方法是每次修改它,因为它最初来自Unity DI解析器方法,并且每次调用存储的服务及其方法时实体都不会新建。

如果在特定的web api线程或端点中完成特定用例场景而不是在每个方法调用中更新它时,当前上下文可以以不同或更好的方式被清除以使其执行得更快,这是未知的保存的服务。

解决方案每次存储在静态变量中并在每个方法上重复使用:

// some service
public class SomeSerivce : ISomeService
{
...
   // when the service is stored must use new context liberally
   public void SomeStaticMethod() {
        _DavinciEntities = new DavinciEntities();
    ... // work
    }
}

可能需要这样做的一个示例是过滤器或全局过滤器。