public void Configure(GrainType grainType, GrainProperties properties, GrainTypeComponents shared) { if (_grainClassMap.TryGetGrainClass(grainType, out var grainClass) && grainClass.IsAssignableFrom(typeof(ExplicitlyRegisteredSimpleDIGrain))) { shared.SetComponent <IGrainActivator>(this); } }
private static ImmutableDictionary <GrainType, GrainProperties> CreateGrainManifest( IEnumerable <IGrainPropertiesProvider> grainMetadataProviders, IOptions <GrainTypeOptions> grainTypeOptions, GrainTypeResolver grainTypeProvider) { var propertiesMap = ImmutableDictionary.CreateBuilder <GrainType, GrainProperties>(); foreach (var grainClass in grainTypeOptions.Value.Classes) { var grainType = grainTypeProvider.GetGrainType((Type)grainClass); var properties = new Dictionary <string, string>(); foreach (var provider in grainMetadataProviders) { provider.Populate((Type)grainClass, grainType, properties); } var result = new GrainProperties(properties.ToImmutableDictionary()); if (propertiesMap.ContainsKey(grainType)) { throw new InvalidOperationException($"An entry with the key {grainType} is already present." + $"\nExisting: {propertiesMap[grainType].ToDetailedString()}\nTrying to add: {result.ToDetailedString()}" + "\nConsider using the [GrainType(\"name\")] attribute to give these classes unique names."); } propertiesMap.Add(grainType, result); } return(propertiesMap.ToImmutable()); }
public override void Initialize(GrainProperties properties) { base.Initialize(properties); CustomPlacementScenario result; if (properties.Properties.TryGetValue(ScenarioKey, out var value) && Enum.TryParse(value, out result)) { this.Scenario = result; } }
public bool TryResolvePlacementStrategy(GrainType grainType, GrainProperties properties, out PlacementStrategy result) { if (grainType.IsClient()) { result = _strategy; return(true); } result = default; return(false); }
public override void Initialize(GrainProperties properties) { base.Initialize(properties); if (properties.Properties.TryGetValue(MaxLocalPropertyKey, out var value) && !string.IsNullOrWhiteSpace(value)) { if (int.TryParse(value, out var maxLocal)) { this.MaxLocal = maxLocal; } } }
public bool TryGetConfigurator(GrainType grainType, GrainProperties properties, out IConfigureGrainContext configurator) { if (properties.Properties.TryGetValue(WellKnownGrainTypeProperties.MayInterleavePredicate, out var value) && _grainClassMap.TryGetGrainClass(grainType, out var grainClass)) { var predicate = GetMayInterleavePredicate(grainClass); configurator = new MayInterleaveConfigurator(message => predicate(message.BodyObject as IInvokable)); return(true); } configurator = null; return(false); }
public void Configure(GrainType grainType, GrainProperties properties, GrainTypeSharedContext shared) { if (properties.Properties.TryGetValue(WellKnownGrainTypeProperties.Reentrant, out var value) && bool.Parse(value)) { var component = shared.GetComponent <GrainCanInterleave>(); if (component is null) { component = new GrainCanInterleave(); shared.SetComponent <GrainCanInterleave>(component); } component.MayInterleavePredicates.Add(_ => true); } }
public bool TryResolveGrainDirectory(GrainType grainType, GrainProperties properties, out IGrainDirectory grainDirectory) { if (GenericGrainType.TryParse(grainType, out var constructed) && constructed.IsConstructed) { var generic = constructed.GetUnconstructedGrainType().GrainType; var resolver = GetResolver(); if (resolver.TryGetNonDefaultGrainDirectory(generic, out grainDirectory)) { return(true); } } grainDirectory = default; return(false); }
public ValueTask <SiloAddress> GetActivationAddress(IAddressable reference) { var grainReference = reference as GrainReference; var grainId = grainReference.GrainId; GrainProperties grainProperties = default; if (!siloManifest.Grains.TryGetValue(grainId.Type, out grainProperties)) { var grainManifest = clusterManifest.AllGrainManifests .SelectMany(m => m.Grains.Where(g => g.Key == grainId.Type)) .FirstOrDefault(); if (grainManifest.Value != null) { grainProperties = grainManifest.Value; } else { throw new ArgumentException($"Unable to find Grain type '{grainId.Type}'. Make sure it is added to the Application Parts Manager at the Silo configuration."); } } if (grainProperties != default && grainProperties.Properties.TryGetValue(WellKnownGrainTypeProperties.PlacementStrategy, out string placementStrategy)) { if (placementStrategy == nameof(StatelessWorkerPlacement)) { throw new InvalidOperationException( $"Grain '{grainReference.ToString()}' is a Stateless Worker. This type of grain can't be looked up by this method" ); } } if (this.catalog.FastLookup(grainId, out var addresses)) { var placementResult = addresses.FirstOrDefault(); return(new ValueTask <SiloAddress>(placementResult?.Silo)); } return(LookupAsync(grainId, catalog)); async ValueTask <SiloAddress> LookupAsync(GrainId grainId, Catalog catalog) { var places = await catalog.FullLookup(grainId); return(places.FirstOrDefault()?.Silo); } }
public void Configure(GrainType grainType, GrainProperties properties, GrainTypeSharedContext shared) { if (shared.GetComponent <IGrainActivator>() is object) { return; } if (!_grainClassMap.TryGetGrainClass(grainType, out var grainClass)) { return; } var argumentFactory = _constructorArgumentFactory.CreateFactory(grainClass); var createGrainInstance = ActivatorUtilities.CreateFactory(grainClass, argumentFactory.ArgumentTypes); var instanceActivator = new DefaultGrainActivator(createGrainInstance, argumentFactory); shared.SetComponent <IGrainActivator>(instanceActivator); }
/// <summary> /// Initializes an instance of this type using the provided grain properties. /// </summary> /// <param name="properties"> /// The grain properties. /// </param> public virtual void Initialize(GrainProperties properties) { }