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