2013-07-02 4 views
2

У меня возникли проблемы с разрешением Fofss от Autofac (версия 3.0.2). Почему Autofac может возвращать Funcs для типов, которые он не может решить? Кажется, Autofac выполняет разрешение зависимостей при выполнении func, которое кажется неправильным и должно выполняться при создании Func (не создавая тип Foo, но гарантируя, что его конструктор может быть вызван с известными зарегистрированными типами).Autofac Func Resolution

using System; 
using Autofac; 
using NUnit.Framework; 

namespace AutofacTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var builder = new ContainerBuilder(); 
      builder.RegisterType<Foo>().AsSelf().AsImplementedInterfaces(); 
      var container = builder.Build(); 

      //var foo = container.Resolve<IFoo>(); //Throws because the int arg can't be resolved (as it should) 
      Assert.True(container.IsRegistered<Func<int, IFoo>>()); //This is valid and makes sense 
      var fooFunc = container.Resolve<Func<int, IFoo>>(); 
      var foo = fooFunc(9); 

      //Assert.False(container.IsRegistered<Func<string, IFoo>>()); //Why is this true? 
      var badFooFunc = container.Resolve<Func<string, IFoo>>(); // Why doesn't Autofac throw here? 
      var badFoo = badFooFunc(string.Empty); // Autofac throws here 
     } 

    } 

    interface IFoo { } 
    public class Foo : IFoo 
    { 
     public string ArgStr { get; set; } 
     public Foo(int arg) 
     { 
      this.ArgStr = arg.ToString(); 
     } 
    } 

} 
+0

Этот тип вопросов: например, почему что-то реализовано тем или иным способом, не подходит для SO ... вам лучше спросить об этом в группе обсуждения: https://groups.google.com/forum/#! forum/autofac – nemesv

+0

Это вопрос использования, и в соответствии с группой: «Если у вас есть вопрос использования/поддержки, мы бы предпочли вам описать его и использовать тег« autofac »в Stack Overflow» – smith324

+0

Что вы пытаясь достичь? –

ответ

2

Согласно this code, кажется, что Func<> - это скомпилированный звонок Resolve с использованием TypedParameter. Поскольку вызов не выполняется до тех пор, пока вы не вызовете Func<>, он не сможет определить, действительно ли вызов действителен и параметры могут быть сопоставлены.

Я не уверен, что Autofac предоставляет простой способ проверить возможность разрешения без фактического разрешения - но это определенно не является общей функциональностью, и поэтому неудивительно, что Func<> не включает это.

Однако, учитывая, что Autofac является открытым исходным кодом, вы можете определенно изучить возможность добавления этой функциональности, если вы заинтересованы.

+0

Хм хорошо, что несчастливо. – smith324

1

Наличие функции разрешения ее зависимостей во время выполнения - это определение инъекции зависимостей и инверсии управления. Если бы это не сделало этого, это не было бы МОК.

+0

Я думаю, вы запутались в терминологии, что легко связано с темами, связанными с МОК. В исходном коде OP это конкретная строка 'var badFooFunc = container.Resolve >();' IS - разрешение, а оно - во время выполнения. Тем не менее по какой-то причине он преуспевает и дает непригодный результат. –