StructureMap -> Lamar. NET Создание службы Core 3.1 не работает - PullRequest
1 голос
/ 06 января 2020

Я пытаюсь перейти с StructureMap на Lamar (4.1.0) в последней версии do tnet core (3.1)

Этот проект работал до перехода на Lamar, но многое изменилось. я теряю прикосновение.

Вопрос?
После сканирования, как я могу создать экземпляр объекта с конструктором объекта, который уже был проверен. Я понимаю, что StructureMap немного отличается, но этот код работал ранее.

Код ниже:

Startup.cs (попытка нового Ламара)


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 (старый, который работал)

Новый Lamar (4.1) больше не позволяет мне создавать без параметров

Перепробовал все экземпляры но они не работали ... так вот я

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


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

1 Ответ

1 голос
/ 06 января 2020

В этом случае 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);
    });

//...

Ссылка Создание объектов с помощью лямбда-символов

...