public void UsingInitialImpl_maps_and_passes_parameters([Frozen] ICreatesAutofacDecorator <IServiceInterface> wrapped, GenericDecoratorBuilderAdapter <IServiceInterface> sut, ICustomizesAutofacDecorator <IServiceInterface> customiser) { Parameter[] parameters = null; Mock.Get(wrapped) .Setup(x => x.UsingInitialImpl <ServiceImpl1>(It.IsAny <Parameter[]>())) .Callback((Parameter[] @params) => parameters = @params) .Returns(customiser); sut.UsingInitialImpl <ServiceImpl1>(TypedParam.From("Foo bar"), TypedParam.From(5)); IEqualityComparer <Parameter> comparer = new TypedParameterComparer(); var expected = new[] { TypedParameter.From("Foo bar"), TypedParameter.From(5), }; Assert.That(parameters, Is.EqualTo(expected).Using(comparer)); }
public void ThenWrapWith_maps_and_passes_parameters([Frozen] ICustomizesAutofacDecorator wrapped, DecoratorCustomizerAdapter sut, ICustomizesAutofacDecorator customiser) { Parameter[] parameters = null; Mock.Get(wrapped) .Setup(x => x.ThenWrapWith <ServiceImpl1>(It.IsAny <Parameter[]>())) .Callback((Parameter[] @params) => parameters = @params) .Returns(customiser); sut.ThenWrapWith <ServiceImpl1>(TypedParam.From("Foo bar"), TypedParam.From(5)); IEqualityComparer <Parameter> comparer = new TypedParameterComparer(); var expected = new[] { TypedParameter.From("Foo bar"), TypedParameter.From(5), }; Assert.That(parameters, Is.EqualTo(expected).Using(comparer)); }
/// <summary> /// Stellt die Implementierung für Vorgänge bereit, die einen Member aufrufen.Von der <see cref="T:System.Dynamic.DynamicObject"/>-Klasse abgeleitete Klassen können diese Methode überschreiben, um dynamisches Verhalten für Vorgänge wie das Aufrufen einer Methode anzugeben. /// </summary> /// <returns> /// true, wenn der Vorgang erfolgreich ist, andernfalls false.Wenn die Methode false zurückgibt, wird das Verhalten vom Laufzeitbinder der Sprache bestimmt.(In den meisten Fällen wird eine sprachspezifische Laufzeitausnahme ausgelöst.) /// </returns> /// <param name="binder">Stellt Informationen zum dynamischen Vorgang bereit.Die binder.Name-Eigenschaft gibt den Namen des Members an, für den der dynamische Vorgang ausgeführt wird.Für die Anweisung sampleObject.SampleMethod(100), in der sampleObject eine von der <see cref="T:System.Dynamic.DynamicObject"/>-Klasse abgeleitete Instanz der Klasse ist, gibt binder.Name z. B. "SampleMethod" zurück.Die binder.IgnoreCase-Eigenschaft gibt an, ob der Membername die Groß-/Kleinschreibung berücksichtigt.</param><param name="args">Die Argumente, die während des Aufrufvorgangs an den Objektmember übergeben werden.Für die Anweisung sampleObject.SampleMethod(100), in der sampleObject von der <see cref="T:System.Dynamic.DynamicObject"/>-Klasse abgeleitet ist, entspricht <paramref name="args[0]"/> z. B. 100.</param><param name="result">Das Ergebnis des Memberaufrufs.</param> public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { if (binder.Name == "Dispose") { LogEnvironment.LogEvent("Do not Dispose Proxies!", LogSeverity.Error); result = null; return(true); } try { Delegate callback = null; object[] parameters; string methodName = binder.Name; var method = FindMethod(binder.Name, args); parameters = (object[])args.Clone(); for (int i = 0; i < parameters.Length; i++) { Debug.WriteLine($"Cloning parameter {i}"); parameters[i] = new TypedParam(parameters[i]) { NullType = method.MethodArgs[i] }; Debug.WriteLine($"Cloning parameter {i} -> done"); } if (!method.IsAsync) { try { object tmpVal = client.CallRemoteMethod(objectName, methodName, parameters); if (method.ReturnType != null && tmpVal != null && !method.ReturnType.IsInstanceOfType(tmpVal)) { tmpVal = TypeConverter.Convert(tmpVal, method.ReturnType); } Debug.WriteLine($"calling done..."); Debug.WriteLine($"analysing results..."); result = tmpVal; Debug.WriteLine($"Result: {result}"); } catch (Exception ex) { throw new InterProcessException( string.Format("Remote call of method {0} has failed!", methodName), ex); } Debug.WriteLine($"writing back arguments"); WriteBackValues(parameters, args); Debug.WriteLine($"writeback done"); } else { var dlg = MakeAsyncCall(method); var tmpResult = dlg.DynamicInvoke(objectName, method.Name, parameters, args); result = tmpResult; } } catch (InterProcessException ex) { Debug.WriteLine($"got an error"); Debug.WriteLine(ex.OutlineException()); result = null; LogEnvironment.LogDebugEvent(ex.InnerException?.Message, LogSeverity.Error); LogEnvironment.LogDebugEvent(ex.ServerException?.ToString(), LogSeverity.Error); throw; } catch (Exception ex) { result = null; LogEnvironment.LogDebugEvent(ex.ToString(), LogSeverity.Error); throw; } return(true); }
public IServiceInterface GetService(int paramValue) { return(builder.GetDecoratedService <IServiceInterface>(d => d.UsingInitialImpl <ServiceImpl2>() .ThenWrapWith <ServiceDecorator2>(TypedParam.From(paramValue)) .ThenWrapWith <ServiceDecorator1>() )); }