public void Can_Deserialize_Object_With_HasManyRelationship()
        {
            // arrange
            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <OneToManyIndependent>("independents");
            resourceGraphBuilder.AddResource <OneToManyDependent>("dependents");
            var resourceGraph = resourceGraphBuilder.Build();

            var jsonApiContextMock = new Mock <IJsonApiContext>();

            jsonApiContextMock.SetupAllProperties();
            jsonApiContextMock.Setup(m => m.ResourceGraph).Returns(resourceGraph);
            jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary <AttrAttribute, object>());
            jsonApiContextMock.Setup(m => m.RelationshipsToUpdate).Returns(new Dictionary <RelationshipAttribute, object>());
            jsonApiContextMock.Setup(m => m.HasManyRelationshipPointers).Returns(new HasManyRelationshipPointers());

            var jsonApiOptions = new JsonApiOptions();

            jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions);

            var deserializer = new JsonApiDeSerializer(jsonApiContextMock.Object);

            var contentString =
                @"{
                ""data"": {
                    ""type"": ""independents"",
                    ""id"": ""1"",
                    ""attributes"": { },
                    ""relationships"": {
                        ""dependents"": {
                            ""data"": [
                                {
                                    ""type"": ""dependents"",
                                    ""id"": ""2""
                                }
                            ]
                        }
                    }
                }
            }";

            // act
            var result = deserializer.Deserialize <OneToManyIndependent>(contentString);

            // assert
            Assert.NotNull(result);
            Assert.Equal(1, result.Id);
            Assert.NotNull(result.Dependents);
            Assert.NotEmpty(result.Dependents);
            Assert.Single(result.Dependents);

            var dependent = result.Dependents[0];

            Assert.Equal(2, dependent.Id);
        }
        public void Can_Deserialize_Independent_Side_Of_One_To_One_Relationship_With_Relationship_Body()
        {
            // arrange
            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <Independent>("independents");
            resourceGraphBuilder.AddResource <Dependent>("dependents");
            var resourceGraph = resourceGraphBuilder.Build();

            var jsonApiContextMock = new Mock <IJsonApiContext>();

            jsonApiContextMock.SetupAllProperties();
            jsonApiContextMock.Setup(m => m.ResourceGraph).Returns(resourceGraph);
            jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary <AttrAttribute, object>());
            jsonApiContextMock.Setup(m => m.HasOneRelationshipPointers).Returns(new HasOneRelationshipPointers());

            var jsonApiOptions = new JsonApiOptions();

            jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions);

            var deserializer = new JsonApiDeSerializer(jsonApiContextMock.Object);

            var property = Guid.NewGuid().ToString();
            var content  = new Document
            {
                Data = new ResourceObject {
                    Type       = "independents",
                    Id         = "1",
                    Attributes = new Dictionary <string, object> {
                        { "property", property }
                    },
                    // a common case for this is deserialization in unit tests
                    Relationships = new Dictionary <string, RelationshipData> {
                        {
                            "dependent", new RelationshipData
                            {
                                SingleData = new ResourceIdentifierObject("dependents", "1")
                            }
                        }
                    }
                }
            };

            var contentString = JsonConvert.SerializeObject(content);

            // act
            var result = deserializer.Deserialize <Independent>(contentString);

            // assert
            Assert.NotNull(result);
            Assert.Equal(property, result.Property);
            Assert.NotNull(result.Dependent);
            Assert.Equal(1, result.Dependent.Id);
        }
Пример #3
0
        public QueryParametersUnitTestCollection()
        {
            var builder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            builder.AddResource <Article>();
            builder.AddResource <Person>();
            builder.AddResource <Blog>();
            builder.AddResource <Food>();
            builder.AddResource <Song>();
            _resourceGraph          = builder.Build();
            _articleResourceContext = _resourceGraph.GetResourceContext <Article>();
        }
Пример #4
0
        public QueryParametersUnitTestCollection()
        {
            var builder = new ResourceGraphBuilder();

            builder.AddResource <Article>();
            builder.AddResource <Person>();
            builder.AddResource <Blog>();
            builder.AddResource <Food>();
            builder.AddResource <Song>();
            _resourceGraph          = builder.Build();
            _articleResourceContext = _resourceGraph.GetResourceContext <Article>();
        }
        public void Sets_The_DocumentMeta_Property_In_JsonApiContext()
        {
            // arrange
            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <Independent>("independents");
            resourceGraphBuilder.AddResource <Dependent>("dependents");
            var resourceGraph = resourceGraphBuilder.Build();

            var jsonApiContextMock = new Mock <IJsonApiContext>();

            jsonApiContextMock.SetupAllProperties();
            jsonApiContextMock.Setup(m => m.ResourceGraph).Returns(resourceGraph);
            jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary <AttrAttribute, object>());

            var jsonApiOptions = new JsonApiOptions();

            jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions);


            var deserializer = new JsonApiDeSerializer(jsonApiContextMock.Object);

            var property = Guid.NewGuid().ToString();

            var content = new Document
            {
                Meta = new Dictionary <string, object>()
                {
                    { "foo", "bar" }
                },
                Data = new ResourceObject {
                    Type       = "independents",
                    Id         = "1",
                    Attributes = new Dictionary <string, object> {
                        { "property", property }
                    },
                    // a common case for this is deserialization in unit tests
                    Relationships = new Dictionary <string, RelationshipData> {
                        { "dependent", new RelationshipData {
                          } }
                    }
                }
            };

            var contentString = JsonConvert.SerializeObject(content);

            // act
            var result = deserializer.Deserialize <Independent>(contentString);

            // assert
            jsonApiContextMock.VerifySet(mock => mock.DocumentMeta = content.Meta);
        }
        public static IResourceGraph CreateResourceGraph()
        {
            IResourceGraphBuilder builder = new ResourceGraphBuilder();

            builder.AddResource <BenchmarkResource>(BenchmarkResourcePublicNames.Type);
            return(builder.Build());
        }
Пример #7
0
        public static IResourceGraph CreateResourceGraph(IJsonApiOptions options)
        {
            IResourceGraphBuilder builder = new ResourceGraphBuilder(options, NullLoggerFactory.Instance);

            builder.AddResource <BenchmarkResource>(BenchmarkResourcePublicNames.Type);
            return(builder.Build());
        }
Пример #8
0
        protected IResponseDeserializer GetDeserializer()
        {
            var formatter         = GetService <IResourceNameFormatter>();
            var resourcesContexts = GetService <IResourceGraph>().GetResourceContexts();
            var builder           = new ResourceGraphBuilder(formatter);

            foreach (var rc in resourcesContexts)
            {
                if (rc.ResourceType == typeof(TodoItem) || rc.ResourceType == typeof(TodoItemCollection))
                {
                    continue;
                }
                builder.AddResource(rc.ResourceType, rc.IdentityType, rc.ResourceName);
            }
            builder.AddResource <TodoItemClient>(formatter.FormatResourceName(typeof(TodoItem)));
            builder.AddResource <TodoItemCollectionClient, Guid>(formatter.FormatResourceName(typeof(TodoItemCollection)));
            return(new ResponseDeserializer(builder.Build()));
        }
Пример #9
0
        protected IResponseDeserializer GetDeserializer()
        {
            var options           = GetService <IJsonApiOptions>();
            var formatter         = new ResourceNameFormatter(options);
            var resourcesContexts = GetService <IResourceGraph>().GetResourceContexts();
            var builder           = new ResourceGraphBuilder(options, NullLoggerFactory.Instance);

            foreach (var rc in resourcesContexts)
            {
                if (rc.ResourceType == typeof(TodoItem) || rc.ResourceType == typeof(TodoItemCollection))
                {
                    continue;
                }
                builder.AddResource(rc.ResourceType, rc.IdentityType, rc.ResourceName);
            }
            builder.AddResource <TodoItemClient>(formatter.FormatResourceName(typeof(TodoItem)));
            builder.AddResource <TodoItemCollectionClient, Guid>(formatter.FormatResourceName(typeof(TodoItemCollection)));
            return(new ResponseDeserializer(builder.Build(), new ResourceFactory(_factory.ServiceProvider)));
        }
        public void Can_Deserialize_Independent_Side_Of_One_To_One_Relationship()
        {
            // arrange
            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <Independent>("independents");
            resourceGraphBuilder.AddResource <Dependent>("dependents");
            var resourceGraph = resourceGraphBuilder.Build();

            var jsonApiContextMock = new Mock <IJsonApiContext>();

            jsonApiContextMock.SetupAllProperties();
            jsonApiContextMock.Setup(m => m.ResourceGraph).Returns(resourceGraph);
            jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary <AttrAttribute, object>());

            var jsonApiOptions = new JsonApiOptions();

            jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions);

            var deserializer = new JsonApiDeSerializer(jsonApiContextMock.Object);

            var property = Guid.NewGuid().ToString();
            var content  = new Document
            {
                Data = new ResourceObject {
                    Type       = "independents",
                    Id         = "1",
                    Attributes = new Dictionary <string, object> {
                        { "property", property }
                    }
                }
            };

            var contentString = JsonConvert.SerializeObject(content);

            // act
            var result = deserializer.Deserialize <Independent>(contentString);

            // assert
            Assert.NotNull(result);
            Assert.Equal(property, result.Property);
        }
        public void Immutable_Attrs_Are_Not_Included_In_AttributesToUpdate()
        {
            // arrange
            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <TestResource>("test-resource");
            var resourceGraph = resourceGraphBuilder.Build();

            var attributesToUpdate = new Dictionary <AttrAttribute, object>();

            var jsonApiContextMock = new Mock <IJsonApiContext>();

            jsonApiContextMock.SetupAllProperties();
            jsonApiContextMock.Setup(m => m.ResourceGraph).Returns(resourceGraph);
            jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(attributesToUpdate);

            var jsonApiOptions = new JsonApiOptions();

            jsonApiOptions.SerializerSettings.ContractResolver = new DasherizedResolver();
            jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions);

            var deserializer = new JsonApiDeSerializer(jsonApiContextMock.Object);

            var content = new Document
            {
                Data = new ResourceObject {
                    Type       = "test-resource",
                    Id         = "1",
                    Attributes = new Dictionary <string, object>
                    {
                        {
                            "complex-member", new Dictionary <string, string> {
                                { "compound-name", "testName" }
                            }
                        },
                        { "immutable", "value" }
                    }
                }
            };

            var contentString = JsonConvert.SerializeObject(content);

            // act
            var result = deserializer.Deserialize <TestResource>(contentString);

            // assert
            Assert.NotNull(result.ComplexMember);
            Assert.Single(attributesToUpdate);

            foreach (var attr in attributesToUpdate)
            {
                Assert.False(attr.Key.IsImmutable);
            }
        }
        public void AddDbContext_Does_Not_Throw_If_Context_Contains_Members_That_Do_Not_Implement_IIdentifiable()
        {
            // Arrange
            var resourceGraphBuilder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            // Act
            resourceGraphBuilder.AddResource(typeof(TestContext));
            var resourceGraph = (ResourceGraph)resourceGraphBuilder.Build();

            // Assert
            Assert.Empty(resourceGraph.GetResourceContexts());
        }
        public void GetResourceContext_Yields_Right_Type_For_Identifiable()
        {
            // Arrange
            var resourceGraphBuilder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            resourceGraphBuilder.AddResource <Bar>();
            var resourceGraph = (ResourceGraph)resourceGraphBuilder.Build();

            // Act
            var result = resourceGraph.GetResourceContext(typeof(Bar));

            // Assert
            Assert.Equal(typeof(Bar), result.ResourceType);
        }
Пример #14
0
        public void Resources_Without_Names_Specified_Will_Use_Default_Formatter()
        {
            // arrange
            var builder = new ResourceGraphBuilder();

            builder.AddResource <TestResource>();

            // act
            var graph = builder.Build();

            // assert
            var resource = graph.GetContextEntity(typeof(TestResource));

            Assert.Equal("test-resources", resource.EntityName);
        }
        public void Attrs_Without_Names_Specified_Will_Use_Default_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder();

            builder.AddResource <TestResource>();

            // Act
            var resourceGraph = builder.Build();

            // Assert
            var resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Contains(resource.Attributes, (i) => i.PublicAttributeName == "compoundAttribute");
        }
        public void Resources_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder(new CamelCaseNameFormatter());

            builder.AddResource <TestResource>();

            // Act
            var resourceGraph = builder.Build();

            // Assert
            var resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Equal("testResources", resource.ResourceName);
        }
Пример #17
0
        public void Attrs_Without_Names_Specified_Will_Use_Default_Formatter()
        {
            // arrange
            var builder = new ResourceGraphBuilder();

            builder.AddResource <TestResource>();

            // act
            var graph = builder.Build();

            // assert
            var resource = graph.GetContextEntity(typeof(TestResource));

            Assert.Equal("compound-attribute", resource.Attributes.Single().PublicAttributeName);
        }
Пример #18
0
        public void Resources_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            builder.AddResource <TestResource>();

            // Act
            var resourceGraph = builder.Build();

            // Assert
            var resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Equal("testResources", resource.ResourceName);
        }
Пример #19
0
        public void Attrs_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            builder.AddResource <TestResource>();

            // Act
            var resourceGraph = builder.Build();

            // Assert
            var resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Contains(resource.Attributes, (i) => i.PublicName == "compoundAttribute");
        }
Пример #20
0
        public void Relationships_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            builder.AddResource <TestResource>();

            // Act
            var resourceGraph = builder.Build();

            // Assert
            var resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Equal("relatedResource", resource.Relationships.Single(r => r is HasOneAttribute).PublicName);
            Assert.Equal("relatedResources", resource.Relationships.Single(r => !(r is HasOneAttribute)).PublicName);
        }
Пример #21
0
        public void Resources_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // arrange
            JsonApiOptions.ResourceNameFormatter = new CamelCaseNameFormatter();
            var builder = new ResourceGraphBuilder();

            builder.AddResource <TestResource>();

            // act
            var graph = builder.Build();

            // assert
            var resource = graph.GetContextEntity(typeof(TestResource));

            Assert.Equal("testResources", resource.EntityName);
        }
Пример #22
0
        public void Attrs_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // arrange
            JsonApiOptions.ResourceNameFormatter = new CamelCaseNameFormatter();
            var builder = new ResourceGraphBuilder();

            builder.AddResource <TestResource>();

            // act
            var graph = builder.Build();

            // assert
            var resource = graph.GetContextEntity(typeof(TestResource));

            Assert.Contains(resource.Attributes, (i) => i.PublicAttributeName == "compoundAttribute");
        }
        public void Adding_DbContext_Members_That_Do_Not_Implement_IIdentifiable_Logs_Warning()
        {
            // Arrange
            var loggerFactory        = new FakeLoggerFactory();
            var resourceGraphBuilder = new ResourceGraphBuilder(new JsonApiOptions(), loggerFactory);

            resourceGraphBuilder.AddResource(typeof(TestContext));

            // Act
            resourceGraphBuilder.Build();

            // Assert
            Assert.Single(loggerFactory.Logger.Messages);
            Assert.Equal(LogLevel.Warning, loggerFactory.Logger.Messages[0].LogLevel);
            Assert.Equal("Entity 'UnitTests.Internal.ResourceGraphBuilder_Tests+TestContext' does not implement 'IIdentifiable'.", loggerFactory.Logger.Messages[0].Text);
        }
        public void GetResourceContext_Yields_Right_Type_For_LazyLoadingProxy()
        {
            // Arrange
            var resourceGraphBuilder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            resourceGraphBuilder.AddResource <Bar>();
            var resourceGraph  = (ResourceGraph)resourceGraphBuilder.Build();
            var proxyGenerator = new ProxyGenerator();

            // Act
            var proxy  = proxyGenerator.CreateClassProxy <Bar>();
            var result = resourceGraph.GetResourceContext(proxy.GetType());

            // Assert
            Assert.Equal(typeof(Bar), result.ResourceType);
        }
        public void Relationships_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder(new JsonApiOptions());

            builder.AddResource <TestResource>();

            // Act
            var resourceGraph = builder.Build();

            // Assert
            var resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Equal("relatedResource", resource.Relationships.Single(r => r.IsHasOne).PublicRelationshipName);
            Assert.Equal("relatedResources", resource.Relationships.Single(r => r.IsHasMany).PublicRelationshipName);
        }
Пример #26
0
        public void Relationships_Without_Names_Specified_Will_Use_Default_Formatter()
        {
            // arrange
            var builder = new ResourceGraphBuilder();

            builder.AddResource <TestResource>();

            // act
            var graph = builder.Build();

            // assert
            var resource = graph.GetContextEntity(typeof(TestResource));

            Assert.Equal("related-resource", resource.Relationships.Single(r => r.IsHasOne).PublicRelationshipName);
            Assert.Equal("related-resources", resource.Relationships.Single(r => r.IsHasMany).PublicRelationshipName);
        }
Пример #27
0
        public void Can_Serialize_Complex_Types()
        {
            // arrange
            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <TestResource>("test-resource");

            var serializer = GetSerializer(resourceGraphBuilder);

            var resource = new TestResource
            {
                ComplexMember = new ComplexType
                {
                    CompoundName = "testname"
                }
            };

            // act
            var result = serializer.Serialize(resource);

            // assert
            Assert.NotNull(result);

            var expectedFormatted =
                @"{
                ""data"": {
                    ""attributes"": {
                        ""complex-member"": {
                            ""compound-name"": ""testname""
                        }
                    },
                    ""relationships"": {
                        ""children"": {
                            ""links"": {
                                ""self"": ""/test-resource//relationships/children"",
                                ""related"": ""/test-resource//children""
                            }
                        }
                    },
                    ""type"": ""test-resource"",
                    ""id"": """"
                }
            }";
            var expected = Regex.Replace(expectedFormatted, @"\s+", "");

            Assert.Equal(expected, result);
        }
        public void Can_Deserialize_Complex_Types_With_Dasherized_Attrs()
        {
            // arrange
            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <TestResource>("test-resource");
            var resourceGraph = resourceGraphBuilder.Build();

            var jsonApiContextMock = new Mock <IJsonApiContext>();

            jsonApiContextMock.SetupAllProperties();
            jsonApiContextMock.Setup(m => m.ResourceGraph).Returns(resourceGraph);
            jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary <AttrAttribute, object>());

            var jsonApiOptions = new JsonApiOptions();

            jsonApiOptions.SerializerSettings.ContractResolver = new DasherizedResolver(); // <--
            jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions);

            var deserializer = new JsonApiDeSerializer(jsonApiContextMock.Object);

            var content = new Document
            {
                Data = new ResourceObject {
                    Type       = "test-resource",
                    Id         = "1",
                    Attributes = new Dictionary <string, object>
                    {
                        {
                            "complex-member", new Dictionary <string, string> {
                                { "compound-name", "testName" }
                            }
                        }
                    }
                }
            };

            // act
            var result = deserializer.Deserialize <TestResource>(JsonConvert.SerializeObject(content));

            // assert
            Assert.NotNull(result.ComplexMember);
            Assert.Equal("testName", result.ComplexMember.CompoundName);
        }
        public JsonApiDeserializer_Benchmarks()
        {
            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <SimpleType>(TYPE_NAME);
            var resourceGraph = resourceGraphBuilder.Build();

            var jsonApiContextMock = new Mock <IJsonApiContext>();

            jsonApiContextMock.SetupAllProperties();
            jsonApiContextMock.Setup(m => m.ResourceGraph).Returns(resourceGraph);
            jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary <AttrAttribute, object>());

            var jsonApiOptions = new JsonApiOptions();

            jsonApiOptions.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions);


            _jsonApiDeSerializer = new JsonApiDeSerializer(jsonApiContextMock.Object);
        }
Пример #30
0
        protected ResourceServiceTestEnvironmentBase(string resourceName)
        {
            _resourceName = resourceName;

            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <TResource, string>(_resourceName);
            SetupResourceGraph(resourceGraphBuilder);
            ResourceGraph = resourceGraphBuilder.Build();

            JsonApiContext = Substitute.For <IJsonApiContext>();
            JsonApiContext.ResourceGraph.Returns(ResourceGraph);
            JsonApiContext.RequestEntity.Returns(ResourceGraph.GetContextEntity(_resourceName));
            JsonApiContext.Options.Returns(new JsonApiOptions {
                IncludeTotalRecordCount = true
            });

            Entities = new MemoryRepository <TEntity>(GetUniqueKeySelectors(), GetInitialData());

            var config = new MapperConfiguration(cfg =>
            {
                cfg.ValidateInlineMaps = false;
                cfg.AddProfile(new XFMapperProfile(SiteId));
                SetupMapper(cfg);
            });

            Mapper       = config.CreateMapper();
            UserAccessor = Substitute.For <IUserAccessor>();
            UserAccessor.IsAuthenticated.Returns(false);

            SiteOptions = Substitute.For <IOptions <SiteOptions> >();
            SiteOptions.Value.Returns(new SiteOptions
            {
                Id        = SiteId,
                Name      = "xForge",
                Origin    = new Uri("http://" + SiteAuthority),
                SiteDir   = SiteDir,
                SharedDir = SharedDir
            });
        }