1

在我的后端服务中,我使用工作单元模式。我想知道我是否遗漏了与处理对象有关的东西。

首先,这是我到目前为止的代码,它有效。该服务只是调用一个请求处理程序:

 [GlobalExceptionHandlerBehaviour(typeof(GlobalExceptionHandler))]
public class CustomerService : ICustomerService
{                
    public void AddCustomer(AddCustomerRequest request)
    {
        ObjectFactory.GetInstance<AddCustomerRequestHandler>().Execute(request);            
    }       
}

请求处理程序如下所示:

 public class AddCustomerRequestHandler
{
    private readonly IUnitOfWork _unitOfWork;
    private readonly ICustomerRepository _customerRepository;

    public AddCustomerRequestHandler(IUnitOfWork unitOfWork, ICustomerRepository customerRepository)
    {
        _unitOfWork = unitOfWork;
        _customerRepository = customerRepository;
    }

    public void Execute(AddCustomerRequest request)
    {
        var customer = new Customer(request.Id, request.CompanyName);
        _customerRepository.Add(customer);
        _unitOfWork.Commit();               
    } 
}

工作单元定义如下:

public interface IUnitOfWork
{
    void Commit();
}

public class UnitOfWork : IUnitOfWork
{
    private readonly IDatabaseFactory<EfTrackerDbContext> _databaseFactory;
    private EfTrackerDbContext _dataContext;

    public UnitOfWork(IDatabaseFactory<EfTrackerDbContext> databaseFactory)
    {            
        _databaseFactory = databaseFactory;            
    }

    public EfTrackerDbContext DataContext
    {
        get { return _dataContext ?? (_dataContext = _databaseFactory.Get()); }
    }

    public void Commit()
    {
        DataContext.Commit();
    }       
}

EfTrackerDbContext 是实际的 EF 上下文:

public class EfTrackerDbContext : DbContext, IUnitOfWork
{
    public DbSet<Customer> Customers { get; set; }

    public virtual void Commit()
    {
        base.SaveChanges();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Customer>().ToTable("Customer");
    }
}

DatabaseFactory 就像:

public class DatabaseFactory<TContext> : DisposableObject, IDatabaseFactory<TContext> where TContext : DbContext, new()
{
    private TContext _dataContext;
    public TContext Get()
    {
        return _dataContext ?? (_dataContext = new TContext());
    }

    protected override void DisposeManagedResources()
    {
        if (_dataContext != null)
        {
            _dataContext.Dispose();
            _dataContext = null;
        }
    }
}

客户存储库:

public interface ICustomerRepository : IRepository<Customer>
{
    IQueryable<Customer> Customers { get; }
}

public class CustomerRepository : RepositoryBase<EfTrackerDbContext, Customer>, ICustomerRepository
{
    public CustomerRepository(IDatabaseFactory<EfTrackerDbContext> databaseFactory)
        : base(databaseFactory)
    {
    }

    public IQueryable<Customer> Customers
    {
        get { return DataContext.Customers; }
    }
} 

如您所见,一切都被注入了。注册看起来像:

 For<IDatabaseFactory<EfTrackerDbContext>>().HybridHttpOrThreadLocalScoped().Use<DatabaseFactory<EfTrackerDbContext>>();
 For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>();
 For<ICustomerRepository>().HybridHttpOrThreadLocalScoped().Use<CustomerRepository>();

现在,问题是关于处理对象。唯一实现 IDisposable 的地方是 DatabaseFactory,其中 _datacontext 被释放。我想这还不够,所以我有以下问题:

  1. AddCustomerRequestHandler 被注入,所以如果 AddCustomer() 服务操作结束并且垃圾收集开始,它就会被释放。这可以吗,还是我应该在 AddCustomer() 操作结束时显式调用 AddCustomerRequestHandler 上的 Dispose 并让它实现 IDisposable?
  2. UnitOfWork 是否也应该实现 IDisposable,我是否必须明确地调用它?
  3. 如何处置 EfTrackerDbContext ?
  4. 其他备注?

简而言之,我正在寻找在服务操作结束后立即处理所有内容的正确方法。

谢谢你的建议,L

4

1 回答 1

0

每当您使用实现 IDisposable 的东西时,您应该在不再需要它时立即处置它。如果将其用作类中的字段,请在该类中实现 IDisposable 并迭代此过程。

PS:如果您像这样打开代码分析: 在此处输入图像描述

你会得到一些免费的警告指向你:D

于 2012-09-18T12:09:45.060 回答