更改DI容器的实例化类型以更改100+方法

时间:2014-11-17 04:01:16

标签: c# asp.net dependency-injection castle-windsor

随着应用程序使用量的增加,我一直在慢慢地解决一个已经超时的问题。我一直在使用DI的存储库'esque架构。

当开发应用程序时,选择单例模式来提供数据控制器,因为每个会话只会激活一个并且只在需要时进行实例化。

但是,用户使用量增加了,我遇到了线程问题。

我有75个左右的数据控制器,它们都是用以下模式开发的。

    public class MyService : IMyServiceBase
    {
        internal MyServiceDataDataContext _dataContext = null;
        protected IConfigurationService _systemService;

        public MyService(IConfigurationService systemService)
        {
            _systemService = systemService;
            _dataContext = new MyServiceDataDataContext(_systemService.GetCurrentSystem().WriteOnlyDatabase.ConnectionString);
            _dataContext.ObjectTrackingEnabled = false;
        }

        public Domain.Data.MyObject GetSomething(int id)
        {
            return (
                    from s in _dataContext.MyObjects                
                    select Mapper.Map<MyObject, Domain.Data.MyObject>(s)
                ).SingleOrDefault();
        }
}

现在,经过一些研究后,我发现我遇到了最常用控制器的轻微并发问题。我一直在使用下面的修复程序到最常用,并发现在生产服务器上解决我的问题。简而言之,我在每个函数调用中为每个请求创建datacontext作为预期的一次单例方式。

public class MyService : IMyServiceService
{
    internal MyServiceDataDataContext _dataContext = null;
    protected IConfigurationService _systemService;

    public MyService(IConfigurationService systemService)
    {
        _systemService = systemService;
        _dataContext = new DistrictDataDataContext(_systemService.GetCurrentSystem().WriteOnlyDatabase.ConnectionString);
        _dataContext.ObjectTrackingEnabled = false;
    }               

    public Domain.Data.MyObject GetSomething(int id)
    {
        using (_dataContext = new MyServiceDataDataContext(_systemService.GetCurrentSystem().WriteOnlyDatabase.ConnectionString))
        {
            Mapper.CreateMap<MyObject, Domain.Data.MyObject>();
            return (from s in _dataContext.MyObjects                    
                    select Mapper.Map<MyObject, Domain.Data.MyObject>(s)).SingleOrDefault();
        }
    }
}

现在问题是......最好是去所有75个数据控制器并重构所有方法,一些控制器有20个方法,按照上面的例子,或者我可以简单地停止在DI构造函数中使用单例。 / p>

将以下代码段更改为每次调用的内容与调用每种方法中的构造函数相同吗?

AppServiceFactory.Instance.RegisterTypeSingleton<IMyService>(typeof(My.Resources.Data.MyService), "MyService");

由于

1 个答案:

答案 0 :(得分:3)

您应该对所有控制器进行一次更改 - 注入DataContext

public class MyService : IMyServiceBase
{
    private MyServiceDataDataContext dataContext;

    public MyService(MyServiceDataDataContext dataContext)
    {
        this.dataContext = dataContext;
    }

    public Domain.Data.MyObject GetSomething(int id)
    {
        return (
            from s in this.dataContext.MyObjects                
            select Mapper.Map<MyObject, Domain.Data.MyObject>(s))
            .SingleOrDefault();
    }
}

每个对象的生命周期(在您的示例中为DataContext)的责任应该在消费者的外部(MyService) - 您的容器可以并且应该管理所有对象的生命周期。