zsri
zsri

Reputation: 43

property injection using autofac 3.1.1

i am trying to inject through property in the following service, if I try constructor injection it works but I want to do property injection, what am I missing?

public class SodaService  
{  
    public ISoda _s;

    //public SodaService(ISoda s)  
    //{  
    //    _s = s;  
    //}  

    public string GetSoda()
    {
        return _s.SodaName;
    }
}

//Soda Class implementing ISoda  

public class Soda : ISoda  
{  
    public string SodaName
    {
        get { return "Default Soda"; }
    }
}

public interface ISoda  
{  
    string SodaName { get; }
}

//Main calling program

class Program  
{  
    static void Main(string[] args)  
    {  
        var container = GetContainer();   
        SodaService s=container.Resolve<SodaService>();    
        Console.Write(s.GetSoda());  
        Console.Read();  
    }  

    private static IContainer GetContainer()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<Soda>().As<ISoda>();
        builder.RegisterType<SodaService>()
            .PropertiesAutowired();

        var container = builder.Build();
        return container;
    }
}

EDIT: The above was solved and i have one more question....

How can i make something like this work, i do not want to use s = container.Resolve< ISodaService >(); and instead the dependencies should be automatically injected when i run the program

class Program
    { 
        public static ISodaService s { get; set; }
        static void Main(string[] args)
        {
            SetUpContainer();

            //s = container.Resolve<ISodaService>();
            Console.Write(s.GetSoda());
            Console.Read();
        }

        private static void SetUpContainer()
        {
            var builder = new ContainerBuilder();
             builder.RegisterType<Soda>().As<ISoda>();
          builder.RegisterType<SodaService>().As<ISodaService>().PropertiesAutowired();

           builder.Build();

        }
    }

Upvotes: 2

Views: 2642

Answers (1)

cpsaez
cpsaez

Reputation: 324

The problem you have is Main method is static. Instanciate a class of Program and use is as non static class

class Program
    { 
        public ISodaService s { get; set; }
        static void Main(string[] args)
        {
            var resolver=SetUpContainer();
            var instance=resolver.Resolve<Program>();
            instance.Execute(args);
        }

        public void Execute(string[] args)
        {

            Console.Write(s.GetSoda());
            Console.Read();
        }

        private Autofac.IContainer void SetUpContainer()
        {
          var builder = new ContainerBuilder();
          builder.RegisterType<Soda>().As<ISoda>();
          builder.RegisterType<SodaService>().As<ISodaService>().PropertiesAutowired();
          builder.RegisterType<Program>().PropertiesAutowired();
          return builder.Build();

        }
    }

Upvotes: 1

Related Questions