简体   繁体   English

StructureMap -> Lamar .NET Core 3.1 服务创建不起作用

[英]StructureMap -> Lamar .NET Core 3.1 service creation not working

I am trying to migrate from StructureMap to Lamar (4.1.0) on the latest dotnet core release (3.1)我正在尝试在最新的 dotnet 核心版本 (3.1) 上从 StructureMap 迁移到 Lamar (4.1.0)

This project worked before the switch to Lamar, but so much has changed I am getting a touch lost.这个项目在切换到 Lamar 之前就开始工作了,但是已经发生了很大的变化,我有点不知所措。

Question?题?
After the scan occurs, how can I create an instance of an object with a constructor of an object that has already been scanned.扫描发生后,如何使用已扫描对象的构造函数创建对象的实例。 I understand that StructureMap is a bit different, but this code worked previously.我知道 StructureMap 有点不同,但此代码以前有效。

Code below:代码如下:

Startup.cs (attempt at new Lamar) Startup.cs (尝试新的 Lamar)


var container = new Container(cfg =>
{
    cfg.Scan(scanner =>
    {
        scanner.AssembliesAndExecutablesFromApplicationBaseDirectory(a => a.FullName.Contains("Project.Name.Here"));
        scanner.WithDefaultConventions();
        scanner.SingleImplementationsOfInterface();
    });


    cfg.For<IServerInformationDataAccess>()
        .Use(new ServerInformationDataAccess(Configuration.GetConnectionString(DbConnectionKey), Container.GetInstance<IMapper>()));

Startup.cs (old one that worked) Startup.cs (旧的有效)

New Lamar (4.1) does not allow me to create without parameters anymore New Lamar (4.1) 不再允许我在没有参数的情况下创建

Tried all of the instantiations but they did not work... so here I am尝试了所有的实例化,但它们没有用……所以我来了

var container = new Container();

container.Configure(cfg =>
{
    cfg.Scan(s =>
    {
        s.AssembliesAndExecutablesFromApplicationBaseDirectory(a => a.FullName.Contains("Project.Name.Here"));
        s.WithDefaultConventions();
        s.SingleImplementationsOfInterface();
    });

    cfg.For<IServerInformationDataAccess>()
        .Use<ServerInformationDataAccess>(sida => new ServerInformationDataAccess(Configuration.GetConnectionString(DbConnectionKey), container.GetInstance<IMapper>()));

Program.cs程序.cs


public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseLamar()
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

In this case the Use acts as the factory delegate在这种情况下, Use充当工厂委托

//...

cfg.For<IServerInformationDataAccess>()
    .Use<ServerInformationDataAccess>(c => { //<-- c in this case is a container context
        var connectionString = Configuration.GetConnectionString(DbConnectionKey);
        var mapper = c.GetInstance<IMapper>();
        return new ServerInformationDataAccess(connectionString, mapper);
    });

//...

Reference Building Objects with Lambdas 使用 Lambda引用建筑对象

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM