【问题标题】:Unity - resolving without resolve()统一 - 无需 resolve() 即可解决
【发布时间】:2011-04-13 18:50:41
【问题描述】:

我只想用属性 [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],但它始终为空。我是否需要使用 Unity 构建 ClassX 实例才能使其正常工作?看来我必须这样做。我不喜欢那样。

【问题讨论】:

  • 我用一些关于在控制台应用程序中设置的额外信息更新了我的答案,因为这听起来可能是你遇到麻烦的地方。

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


【解决方案1】:

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 服务,并且在这里保持干净使得这种转变非常轻松。

【讨论】:

  • 是的,您需要使用 Unity 解析 ClassX 才能设置 IUnitOfWork 属性
  • 我想定义一次使用的类型和实例,然后再一次使用容器或 resolve() 调用。您是说我必须使用容器构建具有依赖关系的对象(ClassX),以便解决依赖关系。所以我的代码会被 Resolve() 调用弄得乱七八糟。
  • 查看我的更新答案。您应该只在应用程序的一个位置看到 Resolve()。
  • 为什么我只能看到一次?每次我需要启动一个新的 ClassX 实例时,我都必须使用 Resolve(),不是吗?
  • 如果您需要按需创建实例,那么我建议注入一个简单的 Factory,它只是 Unity 的一个薄包装器。除了连接应用程序的位置之外,您真的应该尽量避免引用 Unity。有了更多的细节,我可以给你更具体的答案......
猜你喜欢
  • 1970-01-01
  • 2020-05-31
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多