Может ли контейнер единицы передавать ссылку на себя в качестве параметра конструктора? - PullRequest
19 голосов
/ 06 мая 2009

Есть ли способ для контейнера Юнита передать себя объекту?

т.е:.

public class Something {

     public Something(IUnityContainer container) {
           ...
     }
}

Ответы [ 3 ]

23 голосов
/ 06 мая 2009

Короткий ответ - да.

Это должно быть передано автоматически при использовании методов Resolve.

Например:

IUnityContainer container = new UnityContainer();
var something = container.Resolve<Something>();

Кроме того, это та же техника, которую использует Prism (в CodePlex), если вы хотите разобраться в этом.

Обновление добавлено Тест:

[TestClass]
public class Spike
{
    [TestMethod]
    public void unityTest()
    {
        var container = new UnityContainer();
        var something= container.Resolve<Something>();
        Assert.AreSame(container, something.Container);
        // This passes. Success.
    }
}

public class Something
{
    public Something(IUnityContainer container)
    {
        Container = container;
    }

    public IUnityContainer Container { get; set; }
}
1 голос
/ 06 мая 2009

Первый ответ - это то, о чем я думал. Спасибо.

До Unity мы создали наш собственный контейнер IOC, и у нас есть синтаксис, похожий на ...

<constructor>
    <param name="factory" value="[{factory}]"/>
</constructor>

[{factory}] заставляет его передавать себя в качестве параметра.

Что касается установки его как статического: мне не нравится использовать этот подход, потому что каждый объект становится зависимым от единственного свойства (очевидно). Он менее пригоден для повторного использования и менее тестируем, особенно, если статический только для чтения (что и должно быть). После того, как статическое настроено, вы не можете (или не должны) связываться с ним, что ограничивает тестовые сценарии, которые вы можете создать.

Если ничего другого, то объекты должны, по крайней мере, иметь возможность принимать контейнер в качестве параметра. Если его там нет, то он может вернуться к статическому электричеству.

Мы пошли по пути использования единственного экземпляра и закончили тем, что все изменили. На мой взгляд, объекты должны быть более гибкими, чем это. Если потребитель объектов хочет иметь один экземпляр, который он передает своим объектам, это зависит от потребителя. Но сам объект не должен этого требовать. С синтаксисом, показанным выше, очень просто пропустить контейнер через график.

Спасибо за информацию.

Jay

Извините ... новый парень. Теперь я вижу, что это должен был быть комментарий, а не ответ.

0 голосов
/ 06 мая 2009

Как упомянул Бендевей, вы можете передать его, так как это объект, как и любой другой объект, но зачем передавать его?

У вас есть только одно, почему бы не иметь статическое свойство, к которому может обращаться любой класс?

...