Как использовать sturcturemap для передачи двух разных реализаций одного интерфейса в конструктор? - PullRequest
1 голос
/ 02 сентября 2010

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

public class Foo
{
    public Foo(IBar publicData, IBar privateData)
    {
    }
}

Я хотел бы, чтобы структура структуры передавалась в конкретной реализации.IBar как class PublicData и class PrivateData для различных аргументов.Возможно ли это?

ОБНОВЛЕНИЕ

Фактически, чтобы убедиться, что информации достаточно:

Реальные классы, с которыми я работаю, выглядятвот так:

public abstract class EFRepository<T> : IRepository<T>
{
    protected EFRepository(IUnitOfWork publicUnitOfWork, 
                           IUnitOfWork privateUnitOfWork)
    {

    }
}

И реализация EFRepository может выглядеть так:

public partial class ClaimRepository: EFRepository<Claim>, IClaimRepository
{
    public ClaimRepository(IUnitOfWork publishedUnitOfWork, 
                          IUnitOfWork unpublisedUnitOfWork) 
           : base(publishedUnitOfWork, unpublisedUnitOfWork)
    {
    }
}

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

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

Не скомпилирован и не протестирован, но он должен работать в принципе:

For<IBar>.Add<PublicData>.Named("public");
For<IBar>.Add<PrivateData>.Named("private");

For<IFoo>.Use<Foo>()
  .Ctor<IBar>("publicData").Is(d => d.TheInstanceNamed("public"))
  .Ctor<IBar>("privateData").Is(d => d.TheInstanceNamed("private"));

Редактировать: Для создания этого соглашения можно использовать IRegistrationConvention

public class FooConvention : IRegistrationConvention
{
  static readonly Type PluginType = typeof(IFoo);

  public void Process(Type type, Registry registry)
  {
     if (type.IsAbstract || !type.IsClass || !PluginType.IsAssignableFrom(type))
       return;

      registry.For(PluginType).Add(type)
         .CtorDependency<IBar>("publicData")
         .IsNamedInstance("public")
         .CtorDependency<IBar>("privateData")
         .IsNamedInstance("private");
  }
}

Соглашение будет применяться при сканировании

Scan(scan => 
{
  scan.AssemblyContainingType<IFoo>();
  scan.Convention<FooConvention>();
}

См. Раздел Сканирующие сборки в документах SM для получения дополнительной информации.

0 голосов
/ 14 сентября 2010

Настройте конфигурацию следующим образом:

For<IFoo>.Use<Foo>();
For<IBar>.Use<IBar>();

Тогда получите экземпляры следующим образом:

IBar privateData = ObjectFactory.GetInstance<IBar>();
IBar publicData = ObjectFactory.GetInstance<IBar>();

IFoo foo = ObjectFactory
    .With<IBar>(publicData)
    .With<IBar>(privateBar)
    .GetInstance<IFoo>();

Это всего лишь предложение. Я стою исправлено: -)

...