我有一个班级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;
}
}
答案 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();
}));