我正在构建 ASP.NET MVC 4.5。我已将 StructureMap 添加到我的项目中。我在我的网站和 Ioc 类中创建了:
public static IContainer Initialize()
{
var connectionString = ConfigurationManager.ConnectionStrings["Ebancomat"].ConnectionString;
ObjectFactory.Initialize(x =>
{
x.For<Ebancomat.DataAdapters.IncomeExpenses.IIncomeExpensesDataAdapter>().Use<Ebancomat.DataAdapters.IncomeExpenses.IncomeExpensesDataAdapter>().Ctor<string>("connectionString").Is(connectionString);
x.For<Ebancomat.Repositories.IncomeExpenses.IIncomeExpensesRepository>().Use<Ebancomat.Repositories.IncomeExpenses.IncomeExpensesRepository>();
});
return ObjectFactory.Container;
}
和 StructureMapControllerFactory 类:
public class StructureMapControllerFactory : DefaultControllerFactory
{
private readonly IContainer container;
public StructureMapControllerFactory(IContainer container)
{
this.container = container;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
var instance = container.GetInstance(controllerType) as IController;
if (instance == null)
{
return base.GetControllerInstance(requestContext, controllerType);
}
return instance;
}
}
我添加了这是我的 Global.asax.cs:
var container = Ioc.Initialize();
ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory(container));
当我第一次运行该应用程序时,会打开一个窗口,它需要 Container.cs 。我没有找到该课程,我按了“取消”,从那时起我收到了此错误,但我不明白为什么。 (我在工作中尝试了相同的代码,并且运行良好)
An exception of type 'StructureMap.StructureMapConfigurationException' occurred in StructureMap.dll but was not handled in user code
Additional information: No default Instance is registered and cannot be automatically determined for type 'IUserStore<ApplicationUser>'
它要求 Container.cs,因为这是 StructureMap 中抛出异常的类;由于您(我假设)引用 StructureMap.DLL 二进制文件,因此您将没有源代码。我不会担心这个。
您似乎正在对尚未注册的类型调用
ObjectFactory.GetInstance
。
您的
ObjectFactory.Initialize
注册了 IIncomeExpensesDataAdapter
和 IIncomeExpensesRepository
的具体类型,但我看不到 IUserStore<ApplicationUser>
或 IUserStore<T>
的任何内容
您可以在代码中搜索
ObjectFactory.GetInstance
并查看是否有任何地方您在使用它而无需在 StructureMap 中注册对象图?
我假设
IUserStore<ApplicationUser>
是通过构造函数注入解析的,而 SM 无法解析它,因为它没有在容器内注册。所以你需要做的就是在容器中注册IUserStore<ApplicationUser>
。
我也会摆脱
ObjectFactory
,转而使用new Container
public static IContainer Initialize()
{
var connectionString = ConfigurationManager.ConnectionStrings["Ebancomat"].ConnectionString;
return new Container(
c =>
{
c.For<Ebancomat.DataAdapters.IncomeExpenses.IIncomeExpensesDataAdapter>()
.Use<Ebancomat.DataAdapters.IncomeExpenses.IncomeExpensesDataAdapter>()
.Ctor<string>("connectionString")
.Is(connectionString);
c.For<Ebancomat.Repositories.IncomeExpenses.IIncomeExpensesRepository>()
.Use<Ebancomat.Repositories.IncomeExpenses.IncomeExpensesRepository>();
c.For<IUserStore<ApplicationUser>>().Use<DatabaseUserStore>();
});
}
使用此处发布的其他答案,我能够找到我的问题所在。我必须编辑 StructureMapInitializer.cs 文件以包含更多行,以便找到我创建的存储库和服务类。此外,存储库是从视图而不是表中提取的。
public static IContainer Initialize()
{
var container = new Container();
container.Configure(x =>
{
...
x.For<IDetailedEventViewRepository>().Use<DetailedEventViewRepository>();
x.For<IDetailedEventViewService>().Use<DetailedEventViewService>();
...
MapBuilder.Wireup(x);
...
});
...
return container;
}