2015-03-16 2 views
0

У меня есть службы WCF, из которого мне нужно войти вызовы его методов. Для этого я использовал решение this, чтобы иметь возможность отслеживать вызовы и вызывать мою службу внутреннего аудита, которая использует Entity 5.1 и внедряет службы/репозитории/DbContext с помощью Ninject.WCF с помощью IOperationInvoker Субъекта и Ninject

метод

My Invoke выглядит следующим образом:

public object Invoke(object instance, object[] inputs, out object[] outputs) 
    { 
     var methodParams = (instance).GetType().GetMethod(_operationName).GetParameters(); 
     var parameters = new Dictionary<string, object>(); 
     for (var index = 0; index < inputs.Length; index++) 
      parameters.Add(methodParams[index].Name, inputs[index]); 

     _auditService.TrackFilterParametersValues(_operation.Parent.Type.FullName, _operationName, _operation.Action, parameters); 

     return _baseInvoker.Invoke(instance, inputs, out outputs); 
    } 

В моем модуле Ninject У меня есть внутренний материал, зарегистрированный как это:

Bind<IAuditService>().To<AuditeService>().InRequestScope(); 
Bind(typeof(IRepository<>)).To(typeof(Repository<>)).InRequestScope(); 
Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 
Bind<DbContext>().To<MyEntities>().InRequestScope(); 

Проблема возникает, когда внутри Repository, я называю dbContext, чтобы добавить новый объект Audit следующим образом:

_dbContext.Set<T>().Add(entity); 

Это ошибка, требуя, чтобы tha t DbContext был удален.

Что бы правильный способ регистрации DbContext на службе WCF, так что регистрируется для IOperationInvoker ??

Я должен отметить, что у меня есть все это заявление, то же самое для основного сайта я подающий с этим бэкэндом в MVC4 и она отлично работает (нет WCF там). Поэтому я почти уверен, что что-то нужно исправить для цикла жизненного цикла WCF, но не настолько уверенно в чем.

ответ

1

я нашел причину, почему это ведет себя так противно: в цепи, образованной IOperationInvoker, IOperationBehavior и IServiceBehavior, я подающий AuditService конструктором первой из них 2, но в последнем (IServiceBehavior), так как я был декорирования класс WCF с ним и не может перегрузить конструктор, я использовал DependencyResolver получить AuditService со свойством, как это :

public IAuditService AuditService 
{ 
    get { return DependencyResolver.Current.GetService<IAuditService>(); 
} 

Потом, когда я начал отладки, я заметил, что конструкторы были вызваны, когда клиент Test WCF был запрашивая WCF для данных WSDL, но метод Invoke никогда не называли, потому что нет веб-метод был быть вызван. Таким образом, экземпляр AuditService (и DbContext) был прекрасен во время вызовов конструкторов, но к моменту вызова веб-метода и вызова метода Invoke для IOperationInvoker DbContext уже был удален уже давно.

Мое обходное решение для этого состояло в том, чтобы удалить все ссылки на AuditService со всех конструкторов и перенести свойство с помощью DependencyResolver из ServiceBehavior в реализацию IOperationInvoker. Как только я это сделал, AuditService называется правильным, когда это необходимо, никогда раньше, и его DbContext никогда не удаляется.

0

Если MyEntities наследует от DbContext, то это должно работать:

Bind(typeof(DbContext)).To(typeof(MyEntities)).InRequestScope(); 
+0

То, как я зарегистрировался, отлично работает для веб-методов. Проблема оказалась связанной с жизненным циклом OperationInvoker и других расширений. Перемещая вызов в AuditService должным образом из одного места в другое, это делало магию, и все работало как шарм. Спасибо в любом случае! – CesarD

Смежные вопросы