Asp.net mvc 3 具有构造函数参数的StructureMap容器

Asp.net mvc 3 具有构造函数参数的StructureMap容器,asp.net-mvc-3,c#-3.0,structuremap,Asp.net Mvc 3,C# 3.0,Structuremap,我有一个类,RepositoryManager,我正在我的一些控制器中使用这个类: public RepositoryManager { public IGenericRepository Repository {get; set;} public RepositoryManager() { Repository = new GenericRepository(new MyEntities()); } //... } 我想将IGene

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

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

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

    //...
}
我想将IGenericRepository移动到(IoC)容器中

x.For<IGenericRepository>().Use<GenericRepository>().Ctor<MyEntities>("MyEntities");
但是注射无效。我还尝试在存储库上使用
[SetterProperty]
属性,但存储库仍然没有实例化

我做错了什么

我的完整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;
    }
}
公共静态类IoC{
公共静态IContainer初始化(){
ObjectFactory.Initialize(x=>
{
x、 扫描(扫描=>
{
扫描。卡入总成();
scan.WithDefaultConventions();
});
x、 For().Use();
x、 For().Use().Ctor(“MyEntities”);
});
返回ObjectFactory.Container;
}
}

基本上,您的IoC初始化对于IGenericRepository来说是错误的。将其更改为:

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

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

您不需要注册具体类型;它们将由StructureMap解析。扫描仪已使用默认约定,因此对于上述示例,以下注册码已足够:

    ObjectFactory.Initialize(x => x.Scan(scanner =>
    {
        scanner.TheCallingAssembly();
        scanner.WithDefaultConventions();
    }));
仅供参考(与您的问题无关),ObjectFactory已经用作静态网关,因此无需将其封装在您自己的IoC静态类中。如果您仍然喜欢自己的静态类,那么就没有理由使用StructureMaps——只需创建一个新的容器实例,并将初始化块传递给它的构造函数。从Initialize方法返回该值。
    ObjectFactory.Initialize(x => x.Scan(scanner =>
    {
        scanner.TheCallingAssembly();
        scanner.WithDefaultConventions();
    }));