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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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# 具有MVC、Ninject和WCF服务的控制台应用程序(处理问题?)_C#_Wcf_Asp.net Mvc 4_Dependency Injection_Ninject - Fatal编程技术网

C# 具有MVC、Ninject和WCF服务的控制台应用程序(处理问题?)

C# 具有MVC、Ninject和WCF服务的控制台应用程序(处理问题?),c#,wcf,asp.net-mvc-4,dependency-injection,ninject,C#,Wcf,Asp.net Mvc 4,Dependency Injection,Ninject,我有一个MVC应用程序,所有Ninject的东西都连接好了。在应用程序中,我想添加调用WCF服务的功能,然后WCF服务向RabbitMQ队列发送批量消息,即批量打印 “处理器”应用程序订阅队列中的消息并对其进行处理。在这里,我还想更新数据库中的一些内容,因此我希望MVC应用程序中的所有服务和存储库都可用 处理器应用程序实现以下功能: public abstract class KernelImplementation { private IKernel _kernel; pub

我有一个MVC应用程序,所有Ninject的东西都连接好了。在应用程序中,我想添加调用WCF服务的功能,然后WCF服务向RabbitMQ队列发送批量消息,即批量打印

“处理器”应用程序订阅队列中的消息并对其进行处理。在这里,我还想更新数据库中的一些内容,因此我希望MVC应用程序中的所有服务和存储库都可用

处理器应用程序实现以下功能:

public abstract class KernelImplementation
{
    private IKernel _kernel;

    public IKernel Kernel
    {
        get
        {
            if (_kernel != null)
                return _kernel;
            else
            {
                _kernel = new StandardKernel(new RepositoryModule(),
                                                 new DomainModule(),
                                                 new ServiceModule(),
                                                 new MessageModule());
                return _kernel;
            }
        }
    }
}
所有Ninject存储库绑定都在RepositoryModule中指定,该模块也在MVC应用程序中使用,如下所示:

Bind<IReviewRepository>().To<ReviewRepository>().InCallScope();
Bind<MyContext>().ToSelf().InCallScope();
ReviewService中的UpdateView方法:

public void UpdateTenancyAgreementReview(TenancyAgreementReview review)
{
    _tenancyAgreementReviewRepository.Update(review);
    _unitOfWork.Commit();
}
存储库:

public abstract class EntityRepositoryBase<T> where T : class
{
     protected MyContext _dataContext;

     protected EntityRepositoryBase(IDbFactory dbFactory)
     {
          this.DbFactory = dbFactory;
          _dbSet = this.DataContext.Set<T>();
     }

     [...]

     public virtual void Update(T entity)
     {
          try
          {
               DataContext.Entry(entity).State = EntityState.Modified;
          }
          catch (Exception exception)
          {
               throw new EntityException(string.Format("Failed to update entity '{0}'", typeof(T).Name), exception);
          }
      }
}
上下文本身是这样绑定的:

Bind<IReviewRepository>().To<ReviewRepository>().InCallScope();
Bind<MyContext>().ToSelf().InCallScope();
从对作用域的描述来看,我认为瞬态作用域是正确的选择,但正如我前面所说,我尝试了各种方法,包括RequestScope、TransientScope、NamedScope甚至Singleton,尽管我知道这不是理想的行为,但是它们似乎都没有正确地处理上下文。

您需要的是每个事务一个DbContext实例。 现在,其他应用程序(如web应用程序或wcf服务)可能会对每个请求执行一个事务,从而使用类似InRequestScope的东西。还要注意,这些应用程序为每个请求创建一个对象图。但是,对于控制台应用程序来说,这是一个未知的概念

此外,作用域仅影响对象的实例化。一旦它们被实例化,作用域对它们没有任何影响

因此,解决问题的一种方法是为每个事务创建相关的对象树/图,然后可以在对象图的每个实例化中使用InCallScope InCallScope实际上是指一次,请参阅。 这意味着您需要一个IReviewPrintMessage工厂,每次执行IReviewPrintMessage.ProcessReviewPrint时,都可以查看并创建IReviewPrintMessage的实例

现在您已经重新创建了每个请求模式

但是,关于这一点,我们不建议这样做


备选方案:您也只能根据需要重新创建DbContext。您使用SynchronizationContext本地存储,或者如果不使用TPL/async await:ThreadLocal,而不是在几乎所有方法上都将它作为附加参数传递给处处DbContext。我已经更详细地描述了这个方法

请发布要更新和处理的代码。我想你想要一个临时作用域,每次都需要一个新实例。您尚未将代码发布到正在执行更新的位置,但它正在重用实例这一事实表明您没有正确处理上下文,否则您将获得ObjectDisposedException。我已尝试将工厂与Wcf.Extensions.factory一起使用,但没有用。我相信DbContext/UnitOfWork的实现方式可能存在潜在问题。谢谢你提出了一个替代方案,我需要在某个时候尝试一下。目前由于时间不够,我不得不放弃使用控制台应用程序的想法,在WCF服务中执行所有操作。