/// <summary> /// Converts this grain to a specific grain interface. /// </summary> /// <typeparam name="TGrainInterface">The type of the grain interface.</typeparam> /// <param name="grain">The grain to convert.</param> /// <returns>A strongly typed <c>GrainReference</c> of grain interface type TGrainInterface.</returns> public static TGrainInterface AsReference <TGrainInterface>(this IAddressable grain) { ThrowIfNullGrain(grain); var grainReference = grain.AsReference(); return((TGrainInterface)grainReference.Runtime.Cast(grain, typeof(TGrainInterface))); }
public void CastAsyncGrainRefCastFromSelf() { IAddressable grain = GrainClient.GrainFactory.GetGrain <ISimpleGrain>(random.Next(), SimpleGrain.SimpleGrainNamePrefix);; ISimpleGrain cast = grain.AsReference <ISimpleGrain>(); Task <int> successfulCallPromise = cast.GetA(); successfulCallPromise.Wait(); Assert.Equal(TaskStatus.RanToCompletion, successfulCallPromise.Status); }
public void CastGrainRefCastFromMyTypePolymorphic() { // MultifacetTestGrain implements IMultifacetReader // MultifacetTestGrain implements IMultifacetWriter IAddressable grain = GrainClient.GrainFactory.GetGrain <IMultifacetTestGrain>(0); Assert.IsAssignableFrom <IMultifacetWriter>(grain); Assert.IsAssignableFrom <IMultifacetReader>(grain); IAddressable cast = grain.AsReference <IMultifacetReader>(); Assert.IsAssignableFrom(grain.GetType(), cast); Assert.IsAssignableFrom <IMultifacetWriter>(cast); Assert.IsAssignableFrom <IMultifacetReader>(grain); IAddressable cast2 = grain.AsReference <IMultifacetWriter>(); Assert.IsAssignableFrom(grain.GetType(), cast2); Assert.IsAssignableFrom <IMultifacetReader>(cast2); Assert.IsAssignableFrom <IMultifacetWriter>(grain); }
public void CastGrainRefCastFromMyTypePolymorphic() { // MultifacetTestGrain implements IMultifacetReader // MultifacetTestGrain implements IMultifacetWriter IAddressable grain = GrainClient.GrainFactory.GetGrain <IMultifacetTestGrain>(0); Assert.IsInstanceOfType(grain, typeof(IMultifacetWriter)); Assert.IsInstanceOfType(grain, typeof(IMultifacetReader)); IAddressable cast = grain.AsReference <IMultifacetReader>(); Assert.IsInstanceOfType(cast, grain.GetType()); Assert.IsInstanceOfType(cast, typeof(IMultifacetWriter)); Assert.IsInstanceOfType(grain, typeof(IMultifacetReader)); IAddressable cast2 = grain.AsReference <IMultifacetReader>(); Assert.IsInstanceOfType(cast2, grain.GetType()); Assert.IsInstanceOfType(cast2, typeof(IMultifacetReader)); Assert.IsInstanceOfType(grain, typeof(IMultifacetWriter)); }
public bool RemoveConsumer(IAddressable consumerAddress) { StreamConsumerData consumer; var consumerReference = consumerAddress.AsReference(); if (!queueData.TryGetValue(consumerReference, out consumer)) { return(false); } consumer.Cursor = null; // kill cursor activity and ensure it does not start again on this consumer data. return(queueData.Remove(consumerReference)); }
public Task<Tuple<TExtension, TExtensionInterface>> BindExtension<TExtension, TExtensionInterface>(Func<TExtension> newExtensionFunc) where TExtension : IGrainExtension where TExtensionInterface : IGrainExtension { TExtension extension; if (!TryGetExtensionHandler(out extension)) { extension = newExtensionFunc(); if (!TryAddExtension(extension)) throw new OrleansException("Failed to register " + typeof(TExtension).Name); } IAddressable currentGrain = this.CurrentActivationData.GrainInstance; var currentTypedGrain = currentGrain.AsReference<TExtensionInterface>(); return Task.FromResult(Tuple.Create(extension, currentTypedGrain)); }
public Task <Tuple <TExtension, TExtensionInterface> > BindExtension <TExtension, TExtensionInterface>(Func <TExtension> newExtensionFunc) where TExtension : IGrainExtension where TExtensionInterface : IGrainExtension { if (RuntimeContext.Current == null) { return(this.HostedClient.BindExtension <TExtension, TExtensionInterface>(newExtensionFunc)); } if (!TryGetExtensionHandler(out TExtension extension)) { extension = newExtensionFunc(); if (!TryAddExtension(extension)) { throw new OrleansException("Failed to register " + typeof(TExtension).Name); } } IAddressable currentGrain = (RuntimeContext.CurrentActivationContext as SchedulingContext)?.Activation.GrainInstance; var currentTypedGrain = currentGrain.AsReference <TExtensionInterface>(); return(Task.FromResult(Tuple.Create(extension, currentTypedGrain))); }
public bool TryGetConsumer(IAddressable consumer, out StreamConsumerData data) { return(queueData.TryGetValue(consumer.AsReference(), out data)); }
public bool Contains(IAddressable consumer) { return(queueData.ContainsKey(consumer.AsReference())); }
/// <summary> /// Casts a grain to a specific grain interface. /// </summary> /// <typeparam name="TGrainInterface">The type of the grain interface.</typeparam> /// <param name="grain">The grain to cast.</param> public static TGrainInterface Cast <TGrainInterface>(this IAddressable grain) { return(grain.AsReference <TGrainInterface>()); }
/// <summary> /// Returns a typed reference to the provided grain. /// </summary> /// <param name="grain">The grain to convert.</param> /// <param name="interfaceType">The type of the grain interface.</param> /// <remarks> /// If the provided value is a grain instance, this will create a reference which implements the provided interface. /// If the provided value is already grain reference, this will create a new reference which implements the provided interface. /// </remarks> /// <returns>A strongly typed reference to the provided grain which implements <paramref name="interfaceType"/>.</returns> public static object AsReference(this IAddressable grain, Type interfaceType) => grain.AsReference().Runtime.Cast(grain, interfaceType);
/// <summary> /// Returns a typed reference to the provided grain. /// </summary> /// <typeparam name="TGrainInterface">The type of the grain interface.</typeparam> /// <param name="grain">The grain to convert.</param> /// <remarks> /// This method is equivalent to <see cref="AsReference{TGrainInterface}"/>. /// If the provided value is a grain instance, this will create a reference which implements the provided interface. /// If the provided value is already grain reference, this will create a new reference which implements the provided interface. /// </remarks> /// <returns>A strongly typed reference to the provided grain which implements <typeparamref name="TGrainInterface"/>.</returns> public static TGrainInterface Cast <TGrainInterface>(this IAddressable grain) => grain.AsReference <TGrainInterface>();
/// <summary> /// Casts the provided <paramref name="grain"/> to the provided <paramref name="interfaceType"/>. /// </summary> /// <param name="grain">The grain.</param> /// <param name="interfaceType">The resulting interface type.</param> /// <returns>A reference to <paramref name="grain"/> which implements <paramref name="interfaceType"/>.</returns> public static object Cast(this IAddressable grain, Type interfaceType) { return(grain.AsReference().Runtime.Cast(grain, interfaceType)); }