【问题标题】:Problem with Setter injection with Structuremap使用 Structuremap 进行 Setter 注入的问题
【发布时间】:2023-03-17 10:32:01
【问题描述】:

我正在创建一个范围为 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 实例,因为我在其他地方使用它,但我特别不正确(或根本不)将该属性的属性注入该实例(或任何与此相关的)。

【问题讨论】:

  • 您不能对属性使用依赖注入,因为属性是由 .NET 框架创建和控制的。如果您展示更多您正在做的事情(例如您的 UnitOfWorkAttribute 代码),我们可能会提供替代解决方案。
  • @Steven:我已经用完整的代码更新了 UnitOfWorkAttibute 类。但是,尽管您根据此groups.google.com/group/structuremap-users/browse_thread/thread/… 帖子(由 Jeremy Miller 回答)说了什么,但发帖人正试图通过他无法访问的实例来完成几乎相同的事情,而 Jeremy 似乎在说这是可能的。跨度>
  • 据我所知,您链接到的线程没有提及属性。你想在属性中注入一个属性。

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


【解决方案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();
        }
    }
}

【讨论】:

  • 使用使用 OnActionExecuting 和 OnActionExecuted 方法的属性我可以让我的代码分配更干净。此外,由于 Structuremap 已经在创建 IUnitOfWork 的实例,因此我可以将其直接注入到控制器中,并且不需要工厂的开销,还可以让 Structuremap 处理对象的 Life Time。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多