2013-02-14 3 views
3

Мне нужно, чтобы разрешение зависимости для моих служб основывалось на значении HTTP-заголовка во входящем запросе.Доступ к IHttpRequest или IRequestContext из контейнера

Я пытался регистрировать фабричный метод так:

container.Register(c => GetDependencyForRequest(c.Resolve<IHttpRequest>())); 

, а также я пробовал:

container.Register(c => GetDependencyForRequest(c.Resolve<IRequestContext>())); 

Однако, как бросить ResolutionException с.

Я бы предпочел, чтобы мне не приходилось садиться на мои Услуги, решив, какую реализацию использовать. Я просто хотел бы, чтобы у них был IDependency в своем конструкторе и разрешил контейнеру его решить.

Есть ли способ сделать это? Или есть еще один способ сделать это?

ответ

1

Ответ был гораздо проще, чем я думал:

container.Register(c => FindDependencyForRequest(HttpContext.Current.ToRequestContext())); 
+0

Если вы используете [встроенный FunK IOC] ServiceStack (https://github.com/ServiceStack/ServiceStack/wiki/The-IoC-container), вы не хотите, чтобы это не было синглом, указав ** ReuseScope .None ** ie 'container.Register (c => new FindDependencyForRequest (HttpContext.Current.ToRequestContext())). ReusedWithin (ReuseScope.None);' – mythz

+0

У меня создалось впечатление, что использование 'Func ' перегрузки ' Container.Register' заставлял предоставленную фабрику назвать каждое разрешение, что фактически приводило к кратковременному использованию области повторного использования. Действительно ли 'ReusedWithin (ReuseScope.None)' необходимо? – rossipedia

+1

Не знаете, почему вы предположили бы, что все документы говорят, что он по умолчанию является одиночным, и вы можете использовать '.ReusedWithin()' для изменения срока службы. [Вот несколько тестов, которые показывают поведение по умолчанию для Funq.] (Https://github.com/ServiceStack/ServiceStack/commit/b7ec3fae3db9fa6ccccd19dcc39ee3167017c8d2) – mythz

2

Я не уверен, есть ли способ сделать это через контейнер IoC. Возможным решением могло бы стать создание собственного подкласса службы, который может «обновить» вашу независимость в своем конструкторе на основе заголовка Http. Ниже приведен какой-то псевдокод, чтобы дать вам представление. Надеюсь это поможет.

public abstract class MyServiceBase : Service 
{ 
    private Dictionary<string, Func<IDependency>> Dependencies = new Dictionary<string, Func<Dependency>>() 
                    { 
                     {"header1",() => new Dependency()}, 
                     {"header2",() => new Dependency()} 
                    }; 

    public IDependency Dependency { get; set; } 

    protected MyServiceBase() 
    { 
     this.Dependency = this.Dependencies[this.RequestContext.GetHeader("headerName")](); 
    } 
} 
+0

Интересно. Мне нравится этот подход, спасибо. – rossipedia

Смежные вопросы