Exemple #1
0
    public Func<NodeUri, INodeLocator, Task<INode>> LoadNodeFactory(INodeLocatorRegistry registry, NodeConfigurationData configuration)
    {
      Debug.Indent();
      Debug.Assert(configuration != null, "Node configuration is NULL");

      Debug.Print("Load Node Factory Descriptor");
      var descriptor = LoadDescriptor(configuration);
      Debug.Assert(descriptor != null, "Unknown or invalid Node descriptor");

      Debug.Print("Load child Node Factories");
      var childTasks = new Dictionary<string, Task<INodeLocatorRegistry>>();
      int childNodeAutoId = 0;
      foreach (var nodeConfiguration in configuration.Nodes)
      {
        childNodeAutoId++;

        var config = nodeConfiguration;
        var id = config.Id ?? childNodeAutoId.ToString("D2");

        if (childTasks.ContainsKey(id))
        {
          id = $"{id}-{childNodeAutoId}";
        }

        Debug.Print("Load Node at '{0}'", id);
        childTasks[id] = Task.Run(() =>
        {
          Debug.Print("Create Node Locator Builder for child node '{0}'", id);
          var childNodeLocatorRegistry = registry.CreateChildRegistry(id);

          Debug.Print("Load Node Factory for child node '{0}'", id);
          var childNodeFactory = LoadNodeFactory(childNodeLocatorRegistry, config);

          Debug.Print("Rregister child Node Factory '{0}'", id);
          registry.RegisterNodeFactory(id, async (uri, locator) => await childNodeFactory(uri, locator));
          
          return childNodeLocatorRegistry;
        });
      }

      var nodeFactory = descriptor.CreateNodeFactory(registry, configuration);

      var task = new Func<NodeUri, INodeLocator, Task<INode>>(async (uri, locator) =>
      {
        Debug.Indent();
        Debug.Print("Wait for all child Node Factories of '{0}' to finish initialization", uri);
        await Task.WhenAll(childTasks.Values);

        Debug.Print("Create Node instance at '{0}'", uri);
        var node = await nodeFactory(uri, locator);

        Debug.Unindent();
        return node;
      });

      Debug.Unindent();
      return task;
    }
    public Func<NodeUri, INodeLocator, Task<INode>> CreateNodeFactory(INodeLocatorRegistry registry, ConfigurationData configuration)
    {
      Debug.Print($"Create ServiceLocatorBuilder for service factory descriptor '{GetType().FullName}'");
      var serviceLocatorRegistry = new ServiceLocatorRegistry(registry);

      Debug.Print($"Configure NodeFactory Services of ServiceFactory Descriptor '{GetType().FullName}'");
      Configure(serviceLocatorRegistry, configuration);

      return (nodeUri, nodeLocator) => Task.Run(async () =>
      {
        Debug.Print($"Configure service dependencies for Node at '{nodeUri}'");
        await Configure(new ServiceLocator(nodeLocator), configuration);

        Debug.Print($"All done for Node at '{nodeUri}' - create an instance");
        return (INode)nodeLocator;
      });
    }