C# 如何以及何时处置我的物品?
在我的后端服务中,我使用工作单元模式。我想知道我是否遗漏了一些与处理物体有关的东西 首先,这是我到目前为止的代码,它是有效的。该服务只调用一个请求处理程序:C# 如何以及何时处置我的物品?,c#,wcf,service,dependency-injection,dispose,C#,Wcf,Service,Dependency Injection,Dispose,在我的后端服务中,我使用工作单元模式。我想知道我是否遗漏了一些与处理物体有关的东西 首先,这是我到目前为止的代码,它是有效的。该服务只调用一个请求处理程序: [GlobalExceptionHandlerBehaviour(typeof(GlobalExceptionHandler))] public class CustomerService : ICustomerService { public void AddCustomer(AddCustome
[GlobalExceptionHandlerBehaviour(typeof(GlobalExceptionHandler))]
public class CustomerService : ICustomerService
{
public void AddCustomer(AddCustomerRequest request)
{
ObjectFactory.GetInstance<AddCustomerRequestHandler>().Execute(request);
}
}
工作单位的定义如下:
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");
}
}
数据库工厂是这样的:
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;
}
}
}
CustomerRepository:
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; }
}
}
如你所见,一切都是注入的。注册情况如下:
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();
}
}
For<IDatabaseFactory<EfTrackerDbContext>>().HybridHttpOrThreadLocalScoped().Use<DatabaseFactory<EfTrackerDbContext>>();
For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>();
For<ICustomerRepository>().HybridHttpOrThreadLocalScoped().Use<CustomerRepository>();
现在的问题是如何处理这些物体。唯一实现IDisposable的地方是DatabaseFactory,其中_datacontext被释放。我想这还不够,所以我有以下问题:
AddCustomerRequestHandler被注入,所以如果AddCustomer服务操作结束,垃圾收集开始,它就会被释放。这可以吗,还是应该在AddCustomer操作结束时明确调用AddCustomerRequestHandler上的Dispose,让它实现IDisposable?
UnitOfWork是否也应该实现IDisposable,我是否必须明确地称之为IDisposable?
如何处理EfTrackerDbContext?
其他评论?
简言之,我正在寻找一种正确的方法,以便在服务操作结束后立即处理所有内容
谢谢你的建议,
L每当您使用实现IDisposable的东西时,您应该在不再需要它时尽快将其处理掉。 如果将其用作类中的字段,请在该类中实现IDisposable并迭代此过程 附言: 如果像这样打开代码分析: 你会得到一些免费的警告:D