2012-07-31 3 views
1

Я пытаюсь получить ссылку на мой контейнер в статическом классе в пределах своего домена, так что я могу сделать что-то вроде этого:Получение ссылки на IUnityContainer в статическом классе

public static class DomainEvents 
{ 
    public static IUnityContainer Container { get; set; } 

    // ... 

    public static void Do<T>(T args) where T : IMyInterface 
    { 
     foreach (var s in Container.ResolveAll<IDoSomething<T>>()) 
      s.DoSomething(args); 
    } 
} 

я, очевидно, не вводить его с помощью конструктора , есть ли другой способ, с помощью которого я могу справиться с этим, чтобы я мог разрешить регистрацию? Чтение некоторых документов не помогло. Любая помощь будет оценена.

+0

Зачем вам это нужно, чтобы быть статическим классом? Если вы используете IoC, должно быть так же просто сделать это обычным классом и ввести его там, где это необходимо. – millimoose

+0

@millimoose: класс DomainEvents, вероятно, вызывается сущностями в контексте разработки Driven Design, и вы не можете (или не должны) выполнять инъекцию конструктора в своих сущностях. Тем не менее, лучше было бы добавить интерфейс 'IDomainEvents' в методах сущностей (используя метод инъекции) вместо ссылки на статический класс. – Steven

+0

@Steven Даже в этом случае я бы, вероятно, сделал что-то вроде следующего: http://rogeralsing.com/2009/05/30/entity-framework-4-entity-dependency-injection/ (Предполагая, что используемая ORM позволяет достаточно быстро подключиться к жизненному циклу объекта.) – millimoose

ответ

2

Почему вы не просто передаете контейнер в качестве параметра функции? Или даже лучше, это выглядит хорошим кандидатом для метода расширения. Если вы измените заголовок функции, как показано ниже, вы должны иметь возможность вызвать Do непосредственно в контейнере. т.е.: container.Do (args);

public static void Do<T>(this IUnityContainer container, T args) where T : IMyInterface 
{ 
    foreach (var s in container.ResolveAll<IDoSomething<T>>()) 
     s.DoSomething(args); 
} 
+0

Спасибо. Похоже, что метод расширения - это то, что мне нужно. Я посмотрю на это. – stephenl

0

Вы, вероятно, практикуя Domain Driven Design и ссылки этого статического DomainEvents класса внутри метода ваших сущностей. К сожалению, это делает модульное тестирование ваших объектов намного сложнее, так как теперь вам нужно настроить контейнер Unity внутри своих тестов.

Вместо этого используйте метод инъекции для методов ваших объектов и вставьте интерфейс IDomainEvents в те методы, которые в нем нуждаются. Хотя инъекции метод часто субоптимальные, конструктор и нагнетательное свойство вне изображений при работе с юридическими лицами, но инъекция метода позволила коду быть нежёстко:

public class Order 
{ 
    public void CancelOrder(IDomainEvents de) 
    { 
     ... 
    } 
} 
Смежные вопросы