Unity - 无需解析()

时间:2011-04-13 18:50:42

标签: c# .net unity-container enterprise-library ioc-container

我想用属性[DoInjection]标记一个属性,并使用注入统一。我不想使用prop = Unity.Resolve(type)。这是痛苦和凌乱。 Unity是否提供了执行此操作的属性,还是我必须构建自己的属性?

编辑:在App.Main中注册

ISessionFactory sf = new SessionFactory();
            container.RegisterType<IRepository, CustomerRepository>(new InjectionConstructor(sf.CurrentUoW));
            container.RegisterInstance<IUnitOfWork>(sf.CurrentUoW);

在ClassX其他类的IUnitOfWork上使用[Dependancy],但它总是为null。我是否需要使用Unity构建ClassX实例才能使其正常工作?看起来我不得不这样做。我不喜欢那样。

1 个答案:

答案 0 :(得分:2)

Unity有一个DependencyAttribute可用于此:

public class MyObject
{
  private SomeOtherObject _dependentObject;

  [Dependency]
  public SomeOtherObject DependentObject 
  {
    get { return _dependentObject; }
    set { _dependentObject = value; }
  }
}

http://msdn.microsoft.com/en-us/library/ff650198.aspx

根据您的问题,听起来您可能会尝试在错误的位置使用Unity,而您的设计感觉告诉您它感觉不对。您应该只看到Unity引导您的应用程序。这是控制台应用程序中的Main方法或web或wcf应用程序中的Global.asax。我们的想法是始终依赖于链中的依赖关系,直到您到达引导程序的位置并使用IoC容器解析该顶级对象。在控制台应用程序中,我这样做:

class Program
{
    static void Main(string[] args)
    {
        using (var container = new UnityContainer())
        {
            container
                .AddExtension(new ConfigureForConsole(args))
                .Resolve<MyApplication>()
                .Execute();
        }
    }
}

http://www.agileatwork.com/console-application-with-ioc/

在这种情况下,MyApplication是我的顶级对象(它不需要是这里的接口)。 ConfigureForConsole只是一次性自定义容器扩展,其中包含所有RegisterType行。或者,您可以在此处从App.Config初始化容器。但想法是你的Main方法几乎没有任何内容。这种方法的另一个好处是它使您的代码更具可移植性。我发现控制台应用程序通常会变成Windows服务并且保持清洁,这使得转换变得非常轻松。