2

我正在尝试为我维护的框架为 Lamar 构建一个包。为了说明我对 StructureMap 的引用的意思,能够将运行时对象与 Service 抽象混合的相关方法是(将容器传递给该工厂类的构造函数的地方):

public IPresenter Create(Type presenterType, Type viewType, IView viewInstance)
{
    container.Configure(x => x.For(presenterType)
        .Use(presenterType)
        .Named(presenterType.Name)
        );

    var args = new ExplicitArguments();
    args.Set("view");
    args.SetArg("view", viewInstance);

    return (IPresenter)container.GetInstance(presenterType, args);
}

我意识到 Lamar 没有实施ExplicitArguments(很公平)。

我玩过 Injectable 功能,但无法让它发挥作用:

public IPresenter Create(Type presenterType, Type viewType, IView viewInstance)
{
    var c = _container.GetNestedContainer();
    c.Inject(viewInstance);

    // return c.GetInstance(presenterType, presenterType.Name.ToString()) as IPresenter; // BOOM!!!

    return _container.GetInstance(presenterType) as IPresenter; // BOOM!!!
}

拉马尔有其他方法吗?

这是我的注册码:

IContainer container = new Container(c =>
{
    c.AddTransient<ISomeService, SomeService>();
    c.Injectable<IMainView>();
    c.AddTransient<MainPresenter>();
});    

我创建了一个示例项目,它重新创建了可以在此处下载的问题。它使用 .NET 5

在该项目中,如果您在 class 中放置断点MainPresenter,您将看到IView参数为 null 并且OrdersService确实解析。

我需要将作为主要形式的具体对象也传入(作为IView)。

干杯

4

1 回答 1

1

LamarPresenterFactory.Create方法viewInstance参数有问题

public IPresenter Create(Type presenterType, Type viewType, IView viewInstance)
{
}

我注意到它应该是IMainView如下类型

public IPresenter Create(Type presenterType, Type viewType, IMainView viewInstance)
{
    var nestedContainer = _container.GetNestedContainer();
    nestedContainer.Inject(viewInstance);

    return nestedContainer.GetInstance(presenterType) as IPresenter;
}

nestedContainer.Inject(viewInstance)参数数据类型需要viewInstance与使用的类型相同c.Injectable<IMainView>();

OrdersService.GetOrders由于没有orders.zip可用文件,我遇到了异常

于 2020-12-29T08:11:50.107 回答