具有构造函数参数的StructureMap容器

时间:2011-09-10 07:48:37

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

我有一个班级RepositoryManager,我在我的一些控制器中使用这个类:

public RepositoryManager
{
    public IGenericRepository Repository {get; set;}

    public RepositoryManager()
    {
        Repository = new GenericRepository(new MyEntities());
    }

    //...
}

我想将IGenericRepository移动到StructureMap Inversion of control(IoC)容器

x.For<IGenericRepository>().Use<GenericRepository>().Ctor<MyEntities>("MyEntities");

然后我将我的类构造函数更改为:

public RepositoryManager(IGenericRepository repository)
{
    Repository = repository;
}

但注射不起作用。我还尝试在Repository上使用[SetterProperty]属性,但Repository仍未实例化。

我做错了什么?

我的完整IoC初始化:

public static class IoC {
    public static IContainer Initialize() {
        ObjectFactory.Initialize(x =>
            {
                x.Scan(scan =>
                    {
                        scan.TheCallingAssembly();
                        scan.WithDefaultConventions();
                    });
                x.For<IRepositoryManager>().Use<RepositoryManager>();
                x.For<IGenericRepository>().Use<GenericRepository>().Ctor<MyEntities>("MyEntities");
            });
        return ObjectFactory.Container;
    }
}

2 个答案:

答案 0 :(得分:0)

基本上,IGenericRepository的IoC初始化错误。将其更改为:

x.For<IGenericRepository>().Use(() => new GenericRepository(new MyEntities()));

在这种情况下,将调用带参数MyEntities的构造函数,并创建MyEntities的实例并将其作为参数传递给该构造函数。

答案 1 :(得分:0)

您无需注册具体类型;它们将由StructureMap解决。扫描仪已经使用默认约定,因此对于上面的示例,以下注册码是完全足够的:

    ObjectFactory.Initialize(x => x.Scan(scanner =>
    {
        scanner.TheCallingAssembly();
        scanner.WithDefaultConventions();
    }));