Использование TypedFactoryFacility неправильно? - PullRequest
1 голос
/ 27 февраля 2012

В моем контейнере IoC установлена ​​следующая фабрика:

// Factory for late-binding scenarios
container.AddFacility<TypedFactoryFacility>();
container.Register(
    Component
        .For<IServiceFactory>()
        .AsFactory()
);

Где IServiceFactory:

public interface IServiceFactory
{
    T Create<T>();
    void Release(object service);
}

И тогда мой контроллер выглядит примерно так:

public class PostsController : BaseController
{
    private readonly IServiceFactory serviceFactory;

    private LinkService linkService
    {
        get { return serviceFactory.Create<LinkService>(); }
    }

    public PostsController(IServiceFactory serviceFactory)
    {
        if (serviceFactory == null)
        {
            throw new ArgumentNullException("serviceFactory");
        }
        this.serviceFactory = serviceFactory;
    }

Суть в том, что даже когда у LinkService есть PerWebRequest образ жизни, мне это может не всегда понадобиться, поэтому вводить его напрямую мне кажется неправильным.

Хотя сейчас возникает вопрос: использую ли я здесь контейнер в качестве локатора службы?

Ответы [ 2 ]

4 голосов
/ 28 февраля 2012

Если T не ограничено, то есть в этом случае вы.Вы помещаете знания о типе для создания в принимающий класс.Эту конфигурацию лучше оставить классу, который отвечает за настройку вашего контейнера.В Castle 3.0 у вас есть возможность использовать Lazy<T> для отсрочки разрешения, что вы можете легко сделать здесь:

 public PostsController(Lazy<ILinkService> linkService) 
 { 
     if (linkService == null) 
     { 
         throw new ArgumentNullException("linkService"); 
     } 

     this.linkService = linkService; 
 } 
2 голосов
/ 28 февраля 2012
...