2012-04-06 2 views
0

Я работаю с autofac. Пока я разрешаю все свои зависимости с инсталляцией конструктора.поведение при введении на созданные вручную объекты

Существует случай, когда я застревают:

Учитывая данный класс клиентов:

public class Customer : ICustomer 
{ 
    public string Name { get; set; } 

    private int ExternId { get; set; } 

    public IExternalIdProvider externalIdProvider { get; set; } 

    public Customer() 
    { 
      this.externalIdProvider = new ConcreteIdProvider(this); 
    } 

    public BevorSave() 
    { 
     this.ExternId = externalIdProvider.GetNextId(); 
    } 
} 

Для того, чтобы создать новый объект клиента, основанный на запросе или графического интерфейса действий. Я использую новый оператор. Однако - есть IdProvider в CustomerClass, который я хочу ввести. (как свойство).

Если Клиент будет решен в IoC контейнер я хотел бы использовать следующую конфигурацию:

builder.RegisterType<ConcreteIdProvider>().As<IExternalIdProvider>(); 
builder.RegisterType<Customer>().As<ICustomer>() 
     .OnActivated(ae => 
      { 
       IExternalIdProvider idProvider = 
       ae.Context.Resolve<IExternalIdProvider>(TypedParameter.From(ae.Instance)); 
       ae.Instance.externalIdProvider = idProvider; 
      }); 

Мой вопрос: Как я могу привнести поведение ExternalIdProvider в клиенте? (С использованием autofac)

В данной статье показан пример, как это будет сделано с локатором: http://blogs.msdn.com/b/simonince/archive/2008/06/30/dependency-injection-is-dead.aspx

Спасибо за вашу помощь.

+0

Возможно, вам потребуется уточнить, что вы пытаетесь сделать с помощью [нефункционального] фрагмента кода. Если вы хотите, чтобы у вас были введенные свойства, вы можете использовать функцию Autofac PropertiesAutowired при регистрации клиента ... но я предполагаю, что это не то, что вам нужно. В примере, на котором вы ссылались, показано использование PostSharp для аспект-ориентированного программирования. Это ключ к этому примеру, а не структура разрешения зависимостей. –

ответ

0

Вы должны пересмотреть свое поведение на своих объектах. Наличие поведения в ваших сущностях заставляет вас делать инъекцию зависимостей, и это приводит к неудобной ситуации, которую вы уже заметили. Взгляните на this related SO question and Mark Seemann's great answer.

Таким образом, вместо этих операций над классом Customer переместите их на класс repository. Другие шаблоны для просмотра: unit of work, commands и queries.

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