团结推迟对象的解决

时间:2015-05-04 13:52:06

标签: c# delegates inversion-of-control unity-container constructor-injection

MSDN上有一个示例Deferring the Resolution of Objects

  // Create a Unity container
IUnityContainer myContainer = new UnityContainer();

// Create an IEnumerable resolver for the IMyClass interface type
var resolver = myContainer.Resolve<Func<IEnumerable<IMyClass>>>();

// ... other code here...

// Register mappings for the IMyClass interface to appropriate concrete types
myContainer.RegisterType<IMyClass, FirstClass>("First");
myContainer.RegisterType<IMyClass, SecondClass>("Second");
myContainer.RegisterType<IMyClass, ThidClass>("Third");

// Resolve a collection of the mapped target objects
IEnumerable<IMyClass> myClassInstances = resolver();

我有点鼓舞并试图完成下面的事情。

我的界面和具体类是:

public interface IImplementMe
{
    void DoSomething();
}
public class FirstImplementation : IImplementMe
{
    public void DoSomething()
    {
        Console.WriteLine("First");
    }
}
public class SecondImplementation : IImplementMe
{
    public void DoSomething()
    {
        Console.WriteLine("Second");
    }
}

我的服务类是这样的:

public class Service
    {
        private bool someCondition;

        Func<Dictionary<string, IImplementMe>> myClassInstances;
        public Service(Func<Dictionary<string, IImplementMe>> myClassInstances)
        {
            this.myClassInstances = myClassInstances;
        }


        public void Foo()
        {
            if (someCondition)
            {
                myClassInstances.Invoke()["First"].DoSomething();
            }
            else
            {
                myClassInstances.Invoke()["Second"].DoSomething();
            }
        }
    }

您可以理解,我正在尝试注册接口的多个实例,并且应该在运行时按需使用正确的实例。

我应该如何注册我的类型,以便我可以通过给别名在我的服务类中使用它们。

我知道我可以通过使用别名注册它们并通过给予别名来解决它们。但我不想在我的服务类中引用Unity。

或许有一种更明智的方法可以做到这一点。

2 个答案:

答案 0 :(得分:1)

该文档适用于Unity2。如果您使用的是Unity3.x,则应使用Lazy<T>代替Func<T> here。我会问为什么你需要使用延迟解决方案,因为对象的构造实际上应该可以忽略性能(如果不是,那么这是代码气味,因为在构造函数中完成了太多的工作)。

如果没有Unity的引用,您的Foo已解析的实例将不知道集合项的注册名称。但您可以通过其他方式区分集合中的项目。您可以在IImplementMe上创建字符串Name属性。或者您可以获得已解决项目的类型。

答案 1 :(得分:0)

最后,我可以想出一些事情。

谢谢Tyler ..

printout()