public void PostConfigure(string name, GrainStorageOptions <TContext, TGrain, TGrainState> options)
        {
            if (!string.Equals(name, typeof(TGrain).FullName))
            {
                throw new Exception("Post configure on wrong grain type.");
            }

            if (options.ReadQuery == null)
            {
                options.ReadQuery = Convention?.CreateDefaultQueryFunc()
                                    ?? DefaultConvention.CreateDefaultQueryFunc <TContext, TGrainState>();
            }

            if (options.QueryExpressionGeneratorFunc == null)
            {
                options.QueryExpressionGeneratorFunc
                    = Convention?.CreateGrainStateQueryExpressionGeneratorFunc()
                      ?? DefaultConvention
                      .CreateDefaultGrainStateQueryExpressionGeneratorFunc <TGrain, TGrainState>(options);
            }

            if (options.IsPersistedFunc == null)
            {
                options.IsPersistedFunc =
                    DefaultConvention.CreateIsPersistedFunc <TGrainState>(options);
            }

            // Configure ETag
            if (options.ShouldUseETag)
            {
                if (!string.IsNullOrWhiteSpace(options.ETagPropertyName))
                {
                    DefaultConvention.ConfigureETag(options.ETagPropertyName, options);
                }
            }

            DefaultConvention.FindAndConfigureETag(options, options.ShouldUseETag);

            // todo: Validate options

            options.IsConfigured = true;
        }