2015-12-16 4 views
0

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

Предположим, что у меня есть абстрактный класс FooBase с безпараметрическим конструктором и его реализация под названием Foo.

В моем клиентском коде AP.Net MVC5 я хотел бы иметь возможность создать экземпляр объекта типа FooBase (я установил Autofac для его решения в Foo). Срок действия и объем этого экземпляра ограничены моим методом, и я хотел бы сделать это так, как это можно было бы назвать фабричным методом.

В настоящее время я использую DependencyResolver, но это кажется немного надуманным. Есть ли более простой способ сделать это?

Например, вот что она в настоящее время выглядит ...

public void SendMessage() 
{ 
    var foo = DependencyResolver.Current.GetService<FooBase>(); 
    Debug.WriteLine(foo.Name); 
} 

Я ищу что-то немного больше, как это ...

public void SendMessage() 
{ 
    var foo = IoC.Resolve<FooBase>(); 
    Debug.WriteLine(foo.Name); 
} 
+0

Разве вы не можете просто добавить 'Resolve' шаблонный метод на свой класс' DependencyResolver', который, в свою очередь говорит, что 'this.Current.GetService <...>()'? В другом примечании вы не можете ввести 'Foo' в конструктор вашего класса? Это позволит вам отказаться от использования шаблона «ServiceLocator», что означало бы, что вам не нужно было бы вызывать «GetService» в середине метода, поскольку все ваши зависимости будут разрешены до того, как будет создан класс? –

+0

Привет. Нет, к сожалению, ни одна инъекция конструктора или инъекция свойств не будут подходящими в этом случае. Класс содержит логику времени выполнения, которая решает, когда должен быть создан экземпляр нового экземпляра класса или когда существующая версия должна быть «взята» из другого места. –

+0

@ StephenRoss Я пытался выяснить, есть ли у Autofac уже стандартный способ сделать это, прежде чем катиться самостоятельно. –

ответ

0

Вместо использования сервисного локатора which is an anti-pattern вы можете просто ввести фабрику, которая позволяет вам создать экземпляр зависимости, если/когда вы хотите. Самый простой способ - ввести Func<FooBase>. Autofac supports this natively. Если вы просто зарегистрируете FooBase, AutoFac знает, как ввести Func<FooBase>. Вот пример:

public class TestClass 
{ 
    private Func<FooBase> m_FooBaseFactory; 

    public TestClass(Func<FooBase> factory) 
    { 
     m_FooBaseFactory = factory; 
    } 

    public void TestMethod() 
    { 
     var foo = m_FooBaseFactory(); 
     //consume foo here 
    } 
} 
+0

Я предпочитаю этот подход, поскольку он не требует от меня создания делегатов внутри моих компонентов службы. Для тех, кто читает это в будущем, эта ссылка на неявные типы отношений также весьма удобна http://docs.autofac.org/en/latest/resolve/relationships.html –

2

Я думаю, что вы можете использовать delegate factories

Сначала объявите фабрику делегатов тем типом, который вы хотите построить во время выполнения:

public class TestService 
{ 
    public delegate TestService Factory(); 
    //other methods.... 
} 

Затем вы можете впрыснуть завод, как и любой другая зависимость, напр:

public class ExampleController 
{ 
    private TestService.Factory _factory; 
    public ExampleController(TestService.Factory factory)     
    { 
     _factory = factory; 
    } 

    public OtherMethod() 
    { 
     var serviceInstance = _factory(); 
    } 
} 

Надеется, что это помогает!

+0

Это подход к работе +1. Однако (IMO) с использованием 'Func ' проще. –

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