Autofac Установить свойство на экземпляр

Я новичок в Autofac и пытаюсь установить общедоступное свойство класса каждый раз, когда он инициализируется. Вот сценарий. У меня много классов, унаследованных от "Entity", которые следуют этому базовому формату ...

public class Person : Entity
{
     public virtual DataContext ServiceContext { get; set; }
     public string FirstName {get; set;}
     ...
}

Эти классы обычно создаются с помощью запроса LINQ следующим образом:

var context = SomeContext(connection);    
var people = context.Query<Person>().Where(item => item.FirstName == "Joe").ToList();

Я пытаюсь передать объект «context» в свойство ServiceContext класса Person каждый раз, когда он создается. В этом примере это свойство будет установлено для каждого человека в списке людей.

В идеале я бы передал DataContext через конструктор Entity, но проблема в том, что у меня нет доступа к Entity или поставщику Linq, поскольку они получены от третьей стороны. Итак, мой вопрос: используя Autofac, как мне добавить «контекст» в свойство «ServiceContext» каждого класса, производного от «Entity»? Похоже, что событие OnActivating близко к тому, что мне нужно, но я не могу заставить его работать.


person SaaS Developer    schedule 02.02.2011    source источник


Ответы (2)


Autofac позволяет вводить свойства при активации компонента. Для ваших целей это можно сделать двумя способами.

Во-первых, вы должны выяснить, как вы хотите создать DataContext. Вы можете зарегистрировать его конструкцию в лямбде, вы можете зарегистрировать конкретный экземпляр или вы можете зарегистрировать тип с параметрами.

var builder = new ContainerBuilder();

// You can register an instance...
var context = new DataContext(connectionString);
builder.RegisterInstance(context).As<DataContext>();

// OR you can register construction in a lambda...
builder.Register(c => new DataContext(connectionString)).As<DataContext>();

// OR you can register the type with constructor parameters.
builder.RegisterType<DataContext>()
       .WithParameter(
          new NamedParameter("fileOrServerOrConnection", connectionString));

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

builder.RegisterType<Person>().PropertiesAutowired();

Что это будет делать, так это после того, как объект Person будет создан, любые свойства, которые могут быть установлены Autofac, будут. В этом случае DataContext будет разрешен и установлен. Просто убедитесь, что при регистрации ваших типов, производных от «Entity» (и вам нужно зарегистрировать их все, иначе Autofac не будет иметь их в своем реестре компонентов для разрешения), что вы добавляете «PropertiesAutowired» в конце.

Нечто похожее на то, что было опубликовано ранее @Chingiz:

builder.RegisterAssemblyTypes(typeof(Person).Assembly)
       .Where(t => t.IsAssignableFrom(typeof(Entity)))
       .PropertiesAutowired();

Если вам нужен больший контроль над ним, вам может потребоваться проверить вики-страницу Autofac на инъекции свойств и события активации компонента для некоторых идей / справки.

person Travis Illig    schedule 25.03.2011

Может это тебе поможет

public class Person : Entity
{
    public Person(DataContext context)
    {
        ServiceContext = context;
    }
    public virtual DataContext ServiceContext { get; set; }
    public string FirstName { get; set; }
}

builder.Register<DataContext>(c => new DataContext(connectionString)).InstancePerHttpRequest();
builder.RegisterAssemblyTypes(typeof (Person).Assembly)
    .Where(t => t.IsAssignableFrom(typeof (Entity)));
person Chingiz Musayev    schedule 02.02.2011
comment
Похоже, это не работает. Строка: builder.Register ‹DataContext› () дает ошибку компиляции, и я не вижу, где вы устанавливаете DataContext для объекта контекста? Я пробовал еще пару вещей, например builder.RegisterInstance (context) .As ‹DataContext› (), но безрезультатно. - person SaaS Developer; 03.02.2011
comment
Потому что DataContext нужна строка подключения. фиксированный. - person Chingiz Musayev; 03.02.2011
comment
Я не думаю, что это сработает, потому что сторонний поставщик Linq, похоже, использует конструктор без параметров. Есть ли способ сделать это с помощью инъекции свойств во время активации? - person SaaS Developer; 03.02.2011