internal static IEntityDescriptor Create(MethodDescriptor methodDescriptor, IDispatcher dispatcher)
 {
     IEntityDescriptor result = null;
     if (dispatcher is OrleansDispatcher)
     {
         var orleanDispatcher = (OrleansDispatcher)dispatcher;
         //var guid = orleanDispatcher.GetGuidForMethod(methodDescriptor);
         // I think we should consult the dispatcher about an existing ID for the descriptor
         result = new OrleansEntityDescriptor(methodDescriptor); //System.Guid.NewGuid());
     }
     else
     {
         result = new MethodEntityDescriptor(methodDescriptor);
     }
     return result;
 }
		internal static async Task<IMethodEntityGrain> CreateMethodEntityGrain(OrleansEntityDescriptor grainDesc)
		{
			Logger.Instance.Log("OrleansDispatcher", "CreateMethodEntityGrain", grainDesc);

			var methodEntityGrain = MethodEntityGrainFactory.GetGrain(grainDesc.MethodDescriptor.ToString());
			// check if the result is initialized
			var methodEntity = await methodEntityGrain.GetMethodEntity();
			if (methodEntity == null)
			{
				Logger.Instance.Log("OrleansDispatcher", "CreateMethodEntityGrain", "MethodEntityGrain for {0} does not exist", grainDesc);
				Contract.Assert(grainDesc.MethodDescriptor != null);
				////  methodEntity = await providerGrain.CreateMethodEntityAsync(grainDesc.MethodDescriptor);
				methodEntity = await CreateMethodEntityUsingGrainsAsync(grainDesc.MethodDescriptor);
				Contract.Assert(methodEntity != null);
				await methodEntityGrain.SetMethodEntity(methodEntity, grainDesc);
				await methodEntityGrain.SetDescriptor(grainDesc);
				return methodEntityGrain;
			}
			else
			{
				Logger.Instance.Log("OrleansDispatcher", "CreateMethodEntityGrain", "MethodEntityGrain for {0} already exists", grainDesc);
				return methodEntityGrain;
			}
		}
        //public async Task ReceiveMessageAsync(IEntityDescriptor source, 
        //                                IMessage message,
        //                                IMethodEntityGrain destinationGrain)
        //{        
        //    //await destinationGrain.ProcessMessaggeAsync(source, message,this);
        //}


        /// <summary>
        ///  
        /// </summary>
        /// <returns></returns>
		public ImmutableHashSet<IEntity> GetAllEntites()
		{
			var result = new HashSet<IEntity>();
			var solutionGrain = SolutionGrainFactory.GetGrain("Solution");
			var methodDescriptors = solutionGrain.GetMethodDescriptors().Result;

			foreach (var methodDescriptor in methodDescriptors)
			{
				var orleansEnitityDesc = new OrleansEntityDescriptor(methodDescriptor);
				IMethodEntityGrain entity = (IMethodEntityGrain)GetEntityAsync(orleansEnitityDesc).Result;
				result.Add(entity);
			}

			return result.ToImmutableHashSet<IEntity>();
		}
        public ImmutableHashSet<IEntityDescriptor> GetAllEntitiesDescriptors()
        {
            var result = new HashSet<IEntityDescriptor>();
			var solutionGrain = SolutionGrainFactory.GetGrain("Solution");
			var methodDescriptors = solutionGrain.GetMethodDescriptors().Result;

			foreach (var methodDescriptor in methodDescriptors)
            {
                var orleansEnitityDesc = new OrleansEntityDescriptor(methodDescriptor);
                result.Add(orleansEnitityDesc);
            }

            return result.ToImmutableHashSet<IEntityDescriptor>();
        }