зарегистрировать один тип для двух интерфейсов в StructureMap - PullRequest
1 голос
/ 06 марта 2012

Можно ли зарегистрировать ОДИН тип для ДВА интерфейса в StructureMap ?Посмотрите:

public interface IUnitOfWork { }

public interface IUnitOfWork<TSession> : IUnitOfWork { }

public class NHibernateUnitOfWork : IUnitOfWork<ISession> { }

Я хочу зарегистрировать NHibernateUnitOfWork как для IUnitOfWork, так и IUnitOfWork<TSession>, например, один экземпляр NHibernateUnitOfWork - для запроса http - будет отвечать как за IUnitOfWork, так и IUnitOfWork<TSession>,Я использую этот реестр:

For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<NHibernateUnitOfWork>();
For<IUnitOfWork<>>().HybridHttpOrThreadLocalScoped().Use<NHibernateUnitOfWork>();

Но я не знаю, это правильно или нет?Можете ли вы помочь мне, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 09 марта 2012

См. Команду «Вперед», как показано в этом ответе:

https://stackoverflow.com/a/2366838/156533

Вам просто нужно изменить жизненный цикл, если вы не хотите синглтона.

0 голосов
/ 07 марта 2012

Глядя на эту регистрацию, я ожидаю, что контейнер создаст для обеих регистраций один NHibernateUnitOfWork в одном HTTP-контексте. Другими словами, я ожидаю, что следующий тест не пройдёт:

var uow1 = container.GetInstance<IUnitOfWork>();
var uow2 = container.GetInstance<IUnitOfWork<ISession>>();
Assert.IsTrue(object.ReferenceEquals(uow1, uow2));

То, что вы, вероятно, ищете, - это контейнер, возвращающий один и тот же экземпляр при разрешении как IUnitOfWork, так и IUnitOfWork<ISession>, что сделало бы предыдущий тест пройденным.

Вы можете изменить свою регистрацию на следующее:

For<NHibernateUnitOfWork>().HybridHttpOrThreadLocalScoped();
For<IUnitOfWork>().LifecycleIs(new UniquePerRequestLifeStyle())
    .Use(() => container.GetInstance<NHibernateUnitOfWork>());
For<IUnitOfWork<ISession>>().LifecycleIs(new UniquePerRequestLifeStyle())
    .Use(() => container.GetInstance<NHibernateUnitOfWork>());

В этом случае каждый раз, когда вы запрашиваете IUnitOfWork, вы будете перезванивать в контейнер и запрашивать NHibernateUnitOfWork, который настроен как HybridHttpOrThreadLocalScoped.

...