using System;
using PipServices3.Commons.Refer;
using PipServices3.Commons.Config;
using PipServices3.Rpc.Clients;

namespace ExampleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            // Instantiation
            var myController = new MyController();

            // Instantiation
            var client = new MyDirectClient();

            // Reference setting
            client.setReferences(References.FromTuples(
                new Descriptor("pip-services", "controller", "controller", "default", "1.0"), myController));

            client.myMethod();
        }
    }

    class MyDirectClient: DirectClient<MyController>
    {
        public MyDirectClient()
        {
            _controller = null;
            _dependencyResolver.Put("controller", new Descriptor("pip-services", "controller", "*", "*", "1.0"));
        }

        public void setReferences(IReferences references)
        {
            this._dependencyResolver.SetReferences(references);
            this._controller = _dependencyResolver.GetOneRequired<MyController>("controller");
        }

        public void myMethod()
        {
            _controller.myMethod();
        }
    }


    class MyController : IConfigurable, IReferenceable
    {
        public void Configure(ConfigParams config)
        {
        }

        public void SetReferences(IReferences references)
        {
        }

        public void myMethod()
        {
            Console.WriteLine("Hello world");
        }
    }
}