Как зарегистрировать класс в IoC в Призме - PullRequest
2 голосов
/ 17 июня 2019

Я пишу приложение с WPF. Я использую библиотеку Prism с IoC как Prism.DryIoC. У меня есть класс AppDbContext.cs для объявления строки подключения к базе данных (здесь MongoDB)

public class AppDbContext : BaseMongoRepository
{
    public AppDbContext(string connectionString, string databaseName = null) : base(connectionString, databaseName)
    {
    }
}

У меня есть класс MyService.cs, который использует класс AppDbContext, который я объявляю в конструкторе. публичный класс MyService: IMyService { private AppDbContext _dbContext;

    public IdentifierRepository(AppDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public void AddCustomer(Customer model)
    {
        // Some code....
        _dbContext.Add(model);
    }
}

В классе App.xaml.cs я переопределяю метод

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterSingleton<IAuthenticationService, AuthenticationService>();


    // MongoDB
    var connectionString = SharedCommon.LocalAppSettings.Database.ConnectionString;
    var database         = SharedCommon.LocalAppSettings.Database.DatabaseName;

    // How to register class MyService.cs here?
    // I dont known.
    containerRegistry<MyService>(() => new MyService(new AppDbContext(connectionString, database))); // Wrong code
}

1 Ответ

2 голосов
/ 17 июня 2019

Вы можете найти все способы регистрации здесь .

Для синглтон MyService:

var myService = new MyService(new AppDbContext(connectionString, database)));
containerRegistry.RegisterInstance(myService);

Для несколькоэкземпляры можно использовать вместо фабрики.

public class MyServiceFactory
{
    private readonly AppDbContext appDbContext;
    public MyServiceFactory(AppDbContext appDbContext)
    {
        this.appDbContext = appDbContext;
    }

    public MyService Create() => new MyService(appDbContext);
}

Зарегистрировать экземпляр фабрики :

var context = new AppDbContext(connectionString, database);
var factory = new MyServiceFactory(context);

containerRegistry.RegisterInstance(factory);

Затем создать экземпляр службы:

var factory = container.Resolve<MyServiceFactory>();
var service = factory.Create();
...