none
Acceder a interface desde metodo estatico en aplicación de consola RRS feed

  • Pregunta

  • Que tal, ya he revisado varias fuentes para solucionar este tema:

    Actualmente tengo una aplicación de consola que se implementará como un webjob en azure, en este caso estoy utilizando una estructura como la siguiente:

    En la capa de def agrego las interfaces de los servicios 

    public interface IOrdersServ
        {
            OrderPlacementResumeDto PlacePendingOrders();
        }
    En la capa imp, implemento la interfaz para acceder a un servicio externo

    public class OrdersServ : IOrdersServ
        {
            public OrderPlacementResumeDto PlacePendingOrders()
            {
                throw new NotImplementedException();
            }
        }

    Mi problema es en la aplicación de consola, ya que quiero acceder al servicio en la capa imp a traves de la interface pero no le he logrado. Intenté cambiando el metodo static a protected utilizando el constructor para acceder a la interfaz, pero no me dio un error:

    Severity Code Description Project File Line Suppression State
    Error CS5001 Program does not contain a static 'Main' method suitable for an entry point xxxxx.Job.App C:\Users\xxxxxxxxxx\source\repos\xxxxx\xxxxxxx.Job.App\CSC 1 Active

     class Program
        {
            private readonly IOrdersServ _orderServ;
            protected Program(IOrdersServ ordersServ)
            {
                _orderServ = ordersServ;
            }
            protected void Main(string[] args)
            {
                Console.WriteLine("Start configuration...");
                CreateHost();
                Console.WriteLine("Configuration completed...");
    
                Console.WriteLine("Placing pending orders...");
    
                OrderPlacementResumeDto response = _orderServ.PlacePendingOrders();
                
    
                if (response != null)
                {
                    Console.BackgroundColor = ConsoleColor.Green;
                    Console.WriteLine("Orders found : " + response.OrdersFound);
                    Console.WriteLine("Orders placed : " + response.OrdersPlaced);
                    Console.WriteLine("Pending orders : " + response.PendingOrders);
                }
                else
                {
                    Console.BackgroundColor = ConsoleColor.Red;
                    Console.WriteLine("Error while trying to place pending orders");
                }
    
                Console.ResetColor();
                Console.WriteLine("Finished process.");
    
    
    
    
            }
    
            public IWebHostBuilder CreateHost() =>
                WebHost.CreateDefaultBuilder()
                .UseStartup<Startup>();
    
    
    
    
    
        }

    Les agradecería su apoyo si alguien me puede apoyar a solucionar este problema.

    Saludos.


    • Editado Héctor Jaime martes, 12 de noviembre de 2019 4:19 me falto información.
    martes, 12 de noviembre de 2019 4:18

Todas las respuestas

  • Hola

    Creo que el Main deve ser

    public static void Main(string[] args)

    {

    }

    y no

    protected void Main(string[] args)

    {

    }

    por que el compilador busca de esta manera el Main Function para ejecutarse

    martes, 12 de noviembre de 2019 5:06
  • Tiene pinta de que estás tratando de usar inyección de dependencias sobre el propio punto de entrada al programa. Esto no puede funcionar, porque no hay nada que se ejecute antes de haber ejecutado dicha entrada para que le pueda inyectar la dependencia.

    El Main tiene que ser "static" (es el punto de entrada al programa) y esa es la razón por la que te sale el error que estás viendo. Una vez DENTRO del Main, ahí sí que puedes instanciar una clase cualquiera (incluso la propia clase que contiene al Main, aunque esto puede resultar confuso) y entonces en esa instanciación es donde sí que le puedes inyectar a la clase instanciada el parámetro con la interfaz.

    martes, 12 de noviembre de 2019 7:38
    Moderador