我只想用属性[DoInjection]标记一个属性,并统一进行注入。我不想使用prop = Unity.Resolve(type)。那是痛苦和混乱。团结是否提供了做到这一点的属性,还是我必须建立自己的属性?

编辑:在App.Main中注册

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


在ClassX其他类中的IUnitOfWork属性上使用[Dependency],但它始终为null。我是否需要使用Unity来构建ClassX实例才能使其正常工作?看来我必须这么做。我不喜欢

最佳答案

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服务,并且在此处保持整洁,这使过渡非常轻松。

关于c# - unity-没有resolve()的解析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5654050/

10-11 21:33