2012-12-03 159 views
0

我有以下控制台程序。但是,属性服务为空,并且以下代码块中的最后一行会引发异常。我错过了什么?使用Unity初始化属性

class Program 
{ 
    static void Main(string[] args) 
    { 
     container = new UnityContainer(); 
     container.RegisterType<Service.IService, Service.Service>(); 
     container.RegisterType<IC1, C1>(); 
     container.Resolve<Service.IService>(); 
     // var c1 = container.Resolve<IC1>(); 
     c1.Run(); 
    } 

    [Depenency] C1 c1 { get; set; } 
} 

public class C1 
{ 
    [Depenency] Service.IService service { get; set; } 

    public void Run() 
    { 
     var s = service.GetSomething(); // service is null 
+0

你为什么要container.Resolve ()的额外调用;在那里?你正在创建一个对象,只是为了抛出它。你不需要这样做,当你解决IC1时,容器会自动做正确的事情 - 一旦你的财产是公开的,就是这样。 –

+0

@ChrisTavares我已经更新了这个问题。还有什么我应该改变的更好的做法? – ca9163d9

+0

嗯,现在代码根本就不会运行,因为你没有解决,甚至不再声明变量c1,而且你也没有解析程序的一个实例,所以依赖于c1不会得到ST。所以现在你有两个未解决的属性,而不是一个。 –

回答

2

属性必须public被注入。

public class C1 
{ 
    [Dependency] public Service.IService service { get; set; } 
... 
} 

事实上,他们需要一个公共设置者。这工作:

public class C1 
{ 
    [Dependency] public Service.IService service { protected get; set; } 
... 
} 
0

您应该使用UnityContainer.Resolve而不是用new创建对象直接解决依赖

+0

使用静态方法而不是创建新实例的好处是什么? – ca9163d9

+1

@NickW直接创建一个新的实例会破坏使用依赖注入容器的整个观点。使用resolve方法允许容器为您提供依赖关系。 – Lukazoid

+0

解析不是静态方法,它是从容器中获取实例的方式。新运算符本身并不重新使用统一依赖关系,这是Unity的缺点之一 –