public virtual IPlumber <T1, T2, TId> Create <T1, T2, TId>(ISynchSourcesConfig <T1, T2, TId> source, IRuleContainer <TId> rules) where TId : IEquatable <TId> { var preprocessor = CreatePreprocessor(source, rules); var synchronizationResolvers = rules.GetTypedResolvers(source).ToList(); var plumber = new ItemMatchPipelinePlumber <T1, T2, TId>(source, synchronizationResolvers, preprocessor); if (Appender != null) { plumber.Appender = Appender; } return(plumber); }
public void SetUpTest() { var type1Config = new TypeConfiguration <LocalTestResource, int>( ltr => ltr.CorrelationId.HasValue ? ltr.CorrelationId.Value : -1, -1); LocalEndpoint = new InMemoryCrudDataEndpoint <LocalTestResource, int>(type1Config, TestData.LocalResults); var endpoint1Config = new EndpointConfiguration <LocalTestResource, int>( type1Config, LocalEndpoint); var type2Config = new TypeConfiguration <RemoteTestResource, int>(rtr => rtr.Id, 0); RemoteEndpoint = new InMemoryCrudDataEndpoint <RemoteTestResource, int>(type2Config, TestData.RemoteResults); var endpoint2Config = new EndpointConfiguration <RemoteTestResource, int>( type2Config, RemoteEndpoint); // This clearly requires a configuration API. ChannelConfig = new ChannelConfiguration <LocalTestResource, RemoteTestResource, int, ItemMatch <LocalTestResource, RemoteTestResource> >(endpoint1Config, endpoint2Config, new TestResourceTranslator()); var itemsPreprocessor = new ItemMatcher <LocalTestResource, RemoteTestResource, int, ItemMatch <LocalTestResource, RemoteTestResource> >(ChannelConfig); ChannelConfig.ItemsPreprocessor = itemsPreprocessor.Match; var resolvers = new List <ISynchronizationResolver <ItemMatch <LocalTestResource, RemoteTestResource> > > { new SynchronizationResolver <ItemMatch <LocalTestResource, RemoteTestResource>, ChannelConfiguration <LocalTestResource, RemoteTestResource, int, ItemMatch <LocalTestResource, RemoteTestResource> > >( ChannelConfig, (item, cfg) => item.Result1 == null, (item, cfg) => { var synchItem = item.Result1; cfg.TypeTranslator.TranslateBackward(item.Result2, ref synchItem); // Now the translate decides wether a new item has to be created, but the decision is there anyway because of the Create. cfg.Type1EndpointConfiguration.Endpoint.Create(synchItem); return(new SynchronizationResult(true)); }) }; Plumber = new ItemMatchPipelinePlumber <LocalTestResource, RemoteTestResource, int>(ChannelConfig, resolvers, itemsPreprocessor.Match); ConstructTestSubject(); }
public void SetUpTest() { var type1Config = new TypeConfiguration<LocalTestResource, int>( ltr => ltr.CorrelationId.HasValue ? ltr.CorrelationId.Value : -1, -1); LocalEndpoint = new InMemoryCrudDataEndpoint<LocalTestResource, int>(type1Config, TestData.LocalResults); var endpoint1Config = new EndpointConfiguration<LocalTestResource, int>( type1Config, LocalEndpoint); var type2Config = new TypeConfiguration<RemoteTestResource, int>(rtr => rtr.Id, 0); RemoteEndpoint = new InMemoryCrudDataEndpoint<RemoteTestResource, int>(type2Config, TestData.RemoteResults); var endpoint2Config = new EndpointConfiguration<RemoteTestResource, int>( type2Config, RemoteEndpoint); // This clearly requires a configuration API. ChannelConfig = new ChannelConfiguration<LocalTestResource, RemoteTestResource, int, ItemMatch<LocalTestResource, RemoteTestResource>>(endpoint1Config, endpoint2Config, new TestResourceTranslator()); var itemsPreprocessor = new ItemMatcher<LocalTestResource, RemoteTestResource, int, ItemMatch<LocalTestResource, RemoteTestResource>>(ChannelConfig); ChannelConfig.ItemsPreprocessor = itemsPreprocessor.Match; var resolvers = new List<ISynchronizationResolver<ItemMatch<LocalTestResource, RemoteTestResource>>> { new SynchronizationResolver<ItemMatch<LocalTestResource,RemoteTestResource>, ChannelConfiguration<LocalTestResource, RemoteTestResource, int, ItemMatch<LocalTestResource, RemoteTestResource>>>( ChannelConfig, (item, cfg) => item.Result1 == null, (item, cfg) => { var synchItem = item.Result1; cfg.TypeTranslator.TranslateBackward(item.Result2, ref synchItem); // Now the translate decides wether a new item has to be created, but the decision is there anyway because of the Create. cfg.Type1EndpointConfiguration.Endpoint.Create(synchItem); return new SynchronizationResult(true); }) }; Plumber = new ItemMatchPipelinePlumber<LocalTestResource, RemoteTestResource, int>(ChannelConfig, resolvers, itemsPreprocessor.Match); ConstructTestSubject(); }