Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以及何时处置我的物品?_C#_Wcf_Service_Dependency Injection_Dispose - Fatal编程技术网

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