2013-07-25 59 views
2

我想通過屬性注入以下服務,如果我嘗試構造函數注入它的作品,但我想做屬性注入,我錯過了什麼?使用autofac的屬性注入3.1.1

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; 
    } 
} 

編輯: 以上得到解決,我有一個問題....

我怎樣才能讓這樣的工作,我不想使用 S = container.Resolve < ISodaService>(); ,而是當我運行該程序

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(); 

     } 
    } 
+1

我錯過了什麼嗎?該物業在哪裏?請注意'_s'是**不是**屬性*,而是公共*字段*。 – Steven

+0

對不起,你是完全正確的,它現在的作品,現在我改變它的財產。 – zsri

+0

@Steven使這個答案 – Alden

回答

1

你有這個問題的相關性都應當自動注入是主要方法是靜態的。 Instanciate一類程序和使用是非靜態類

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(); 

     } 
    }