Проблема с инжектором Setter с Structuremap - PullRequest
1 голос
/ 04 мая 2011

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

Я хочу добавить определенный экземпляр UnitOfWork в свойство типа IUnitOfWork в атрибуте ( см. Код ниже )

Вот мой метод ObjectFactory.Initialize () части, на которую я ссылаюсь:

ObjectFactory.Initialize(x =>
{
    //...   
    //additional content
    //...

    x.For<IUnitOfWork>()
        .HttpContextScoped()
        .Use(context => new UnitOfWork(
            context.GetInstance<ISessionFactory>()));

    x.SetAllProperties(context =>
    {
        context.Matching(p => 
            p.DeclaringType == typeof(UnitOfWorkAttribute));
        context.OfType<IUnitOfWork>();
    });

Класс атрибута:

public class UnitOfWorkAttribute : ActionFilterAttribute {

    public IUnitOfWork UnitOfWork { get; set; }

    public UnitOfWorkAttribute() {
        Order = 0;
    }

    public void OnActionExecuting(ActionExecutingContext filterContext) {
        UnitOfWork.Begin();
    }

    public void OnActionExecuted(ActionExecutedContext filterContext) {
        UnitOfWork.End();
    }
}

Я пытался следовать одному из ДжеремиПримеры Миллера об использовании критериев для этого, но я что-то не так делаю.

Есть мысли о том, что я делаю неправильно?

ПРИМЕЧАНИЕ Это действительно создает UnitOfWorkэкземпляр, как я использую его где-то еще, но я определенно не правильно (или вообще) вводить свойство этого атрибута с этим экземпляром (или любым другим в этом отношении).

1 Ответ

1 голос
/ 04 мая 2011

Попробуйте решить эту проблему, создав фабрику для IUnitOfWork объектов.Поскольку срок службы экземпляров единицы работы должен четко контролироваться (поскольку вы делаете Begin и End, управлять ими самостоятельно гораздо более логично и придерживаться принципа наименьшего удивления .

Вот пример того, что вы можете сделать:

public interface IUnitOfWorkFactory
{
    IUnitOfWork NewUnitOfWork();
}

public class MyController : Controller
{
    private readonly IUnitOfWorkFactory factory;

    public MyController(IUnitOfWorkFactory factory)
    {
        this.factory = factory;
    }

    public void Operation()
    {
        using (var work = new this.factory.NewUnitOfWork())
        {
            work.Begin();

            // do some interesting stuff here.            

            work.End();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...