Как вы используете RegisterFactory? - PullRequest
0 голосов
/ 23 октября 2019

У меня проблемы с пониманием того, как использовать RegisterFactory. Приведенный ниже код прекрасно работает со старым InjectionFactory, но у меня возникают проблемы, когда я пытаюсь сделать то же самое с RegisterFactory.

В примере кода есть раздел без комментариев, в котором используется RegisterFactory, и раздел с комментариями, в котором используется InjectionFactory,Код InjectionFactory работает нормально, но RegisterFactory создает исключение ResolutionFailedException. Unity.ResolutionFailedException: 'Текущий тип, ConsoleApp1.IFoo, является интерфейсом и не может быть создан. Вам не хватает отображения типов?

Что я делаю неправильно?

class Program
{
    static void Main(string[] args)
    {
        var container = new UnityContainer();
        container.EnableDebugDiagnostic();

        container.RegisterType<IFoo, Foo1>("Foo1");
        container.RegisterType<IFoo, Foo2>("Foo2");

        container.RegisterType<MainViewModel>();

        // This does not work
        container.RegisterFactory<Func<string, IFoo>>((c, type, name) => c.Resolve<IFoo>(name));

        // This works
        //container.RegisterType<Func<string, IFoo>>(new InjectionFactory(
        //    ctx => new Func<string, IFoo>(name => container.Resolve<IFoo>(name))));


        var vm = container.Resolve<MainViewModel>();
    }
}

public class MainViewModel
{
    public MainViewModel(Func<string, IFoo> fooFactory)
    {
        var foo1 = fooFactory.Invoke("Foo1");
        var foo2 = fooFactory.Invoke("Foo2");
    }
}

public interface IFoo
{
    string Name { get; }
}

public class Foo1 : IFoo
{
    public string Name { get; set; }

    public Foo1()
    {
        Name = "Foo1";
    }
}

public class Foo2 : IFoo
{
    public string Name { get; set; }

    public Foo2()
    {
        Name = "Foo2";
    }
}

1 Ответ

0 голосов
/ 26 октября 2019

Если вы регистрируетесь с RegisterFactory, вы говорите Unity , как создать экземпляр. Но Unity уже знает, как создать Foo1 и Foo2, потому что вы уже зарегистрировали их.

То, что вы хотите, это фабрика для , которую вы используете, это то, что делает RegisterType, так что это работает.

Обычно такая фабрика реализует некоторые IFooFactory, что делает контекст более очевидным. Но если Func<string, IFoo> зарегистрирован только один раз, он тоже работает нормально.

...