StructureMapConfigurationException

问题描述 投票:0回答:3

我正在构建 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>'
c# asp.net asp.net-mvc structuremap
3个回答
1
投票

它要求 Container.cs,因为这是 StructureMap 中抛出异常的类;由于您(我假设)引用 StructureMap.DLL 二进制文件,因此您将没有源代码。我不会担心这个。

您似乎正在对尚未注册的类型调用

ObjectFactory.GetInstance

您的

ObjectFactory.Initialize
注册了
IIncomeExpensesDataAdapter
IIncomeExpensesRepository
的具体类型,但我看不到
IUserStore<ApplicationUser>
IUserStore<T>

的任何内容

您可以在代码中搜索

ObjectFactory.GetInstance
并查看是否有任何地方您在使用它而无需在 StructureMap 中注册对象图?


1
投票

我假设

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

0
投票

使用此处发布的其他答案,我能够找到我的问题所在。我必须编辑 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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.