使用Structuremap注入Setter的问题

时间:2011-05-04 13:08:57

标签: c# asp.net-mvc-3 dependency-injection structuremap

我正在创建一个作用于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();
    }
}

我试图遵循Jeremy Miller的一个使用标准的例子,但我做的不对。

我对错误做什么的想法?

注意它确实创建了UnitOfWork实例,因为我在其他地方使用它,但我特别不正确(或根本没有)将该属性的属性注入该实例(或任何相关的)。

1 个答案:

答案 0 :(得分:1)

尝试通过为IUnitOfWork个对象创建工厂来解决此问题。由于必须明确控制工作单元实例的生命周期(因为您正在执行BeginEnd,因此自己控制它们更合乎逻辑,并且遵守principle of least surprise

以下是您可以执行的操作示例:

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();
        }
    }
}