结构图和方法注射

时间:2012-06-21 14:31:12

标签: asp.net-mvc dependency-injection structuremap

我使用Structure Map来解析像这样的结构注入

public class MyClass
{
    private readonly IDependency _dependency;

    public MyClass(IDependency dependency)
    {
        _dependency = dependency;
    }
// my methods
}

我有一些类依赖:IDependency

在StructureMap配置中我有

public static IContainer Initialize()
        {
            ObjectFactory.Initialize(x =>
            {
                x.For<IDependency>().Use<Dependency>();
            });
            return ObjectFactory.Container;
        }

一切都很好

但在其他控制器中我需要进行方法注入

public ActionResult(IDependency dependency)
{
    dependency.DoSomething();
}

我希望在依赖变量

中使用我的Dependency类

2 个答案:

答案 0 :(得分:0)

通常,您会在构造函数(或setter)中注入IDependency,并将其分配给您可以在方法中使用的私有类成员。

private readonly IDependency _dependency;

public MyClass(IDependency dep)
{
    this._dependency = dep;
}

public ActionResult MyAction()
{
    _dependency.DoSomething();
}

答案 1 :(得分:0)

@dave我同意你的回答,但认为MyClass是在StructureMap中注册的Shared / Singleton范围。在这种情况下,如果我将dep注入到MyClass中,则意味着我在应用程序的整个生命周期中都持有对dep对象的引用。听起来像是记忆消耗给我。

我最近遇到了同样的情况,并最终确定将StructureMap的IContainer注入构造函数(而不是所有其他无意义的对象),并在需要时使用它来获取对象。

private readonly IContainer _container;

public MyClass(IContainer con)
{
    this._container = con;
}

public ActionResult MyAction()
{
    var _dependency = _container.GetInstance<IDependency> ();
    _dependency.DoSomething();
}

这样我的注入对象就变成了MyAction()方法的范围,并准备好被GC使用