Шаблон единицы работы / репозитория, тип не найден в кэше - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь внедрить шаблон репозитория для целей обучения в проекте.Я использую MVVM Light для регистрации интерфейсов и пытаюсь внедрить их в модель представления.

Я удалил все остальные репозитории для удобства чтения и включил только RuleRepository.

Просмотр модели локатора

Код разрывается при попытке зарегистрировать IUnitOfWork и выдает ошибку - Тип не найден в кэше: YAI.BomConfigurator.Core.Context.BomConfiguratorContext.

Примечание. Не уверены, нужно ли мне регистрировать интерфейс IRepository здесь?

public class ViewModelLocator
{
    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        if (ViewModelBase.IsInDesignModeStatic)
        {
            SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
            SimpleIoc.Default.Register<IUnitOfWork, UnitOfWork>();
        }
        else
        {
            SimpleIoc.Default.Register<IDataService, DataService>();
            SimpleIoc.Default.Register<IUnitOfWork, UnitOfWork>();
        }
        SimpleIoc.Default.Register<LoginViewModel>();
    }

    public LoginViewModel LoginViewModel
    {
        get
        {
            return ServiceLocator.Current.GetInstance<LoginViewModel>();
        }
    }
}

LoginViewModel

Здесь я пытаюсь внедрить IUnitOfWork вмодель представления.

public class LoginViewModel : ViewModelBase
{
    private readonly IUnitOfWork _UnitOfWork;
    public LoginViewModel(IUnitOfWork unitOfWork)
    {
        _UnitOfWork = unitOfWork;
    }
}

IUnitOfWork

public interface IUnitOfWork : IDisposable
{
    IRuleRepository Rules { get; }
    int Complete();
}

UnitOfWork

public class UnitOfWork : IUnitOfWork
{
    private readonly BomConfiguratorContext _context;
    public IRuleRepository Rules { get; private set; }

    public UnitOfWork(BomConfiguratorContext context)
    {
        _context = context;
    }

    public int Complete()
    {
        return _context.SaveChanges();
    }

    public void Dispose()
    {
        _context.Dispose();
    }
}

RuleRepository

public class RuleRepository : Repository<Rule>,IRuleRepository
{
    public RuleRepository(BomConfiguratorContext context)
       : base(context)
    {

    }
}

Я скопировал многое из этого видео с Mosh Hamedani youtube и попытался добавить бит, который мы добавляем в конструктор модели представления.Я новичок в внедрении зависимостей и контейнерах IOC, поэтому не знаю, что именно я делаю здесь неправильно.

Если бы кто-то мог дать мне хорошее объяснение того, что мне нужно изменить и т. Д., Это было бы здорово.Я знаю, что многие люди считают, что Шаблон «Единица работы / Репозиторий» является анти-шаблоном, но меня это не волнует, это исключительно для целей обучения.

Спасибо за любые предложения!

1 Ответ

0 голосов
/ 11 октября 2018

Вы не только внедряете экземпляр UnitOfWork в LoginViewModel, вы также внедряете экземпляр BomConfiguratorContext в UnitOfWork при создании экземпляра UnitOfWork:

public class UnitOfWork : IUnitOfWork
{
    private readonly BomConfiguratorContext _context;
    public IRuleRepository Rules { get; private set; }

    // here you inject a BomConfiguratorContext, but none is registered in the VM Locator
    public UnitOfWork(BomConfiguratorContext context)
    {
        _context = context;
    }

    ...
}

Так что вам нужно изменить ViewModelLocator, чтобы также зарегистрировать BomConfig:

static ViewModelLocator()
{
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

    if (ViewModelBase.IsInDesignModeStatic)
    {
        SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
        SimpleIoc.Default.Register<IUnitOfWork, UnitOfWork>();
    }
    else
    {
        SimpleIoc.Default.Register<IDataService, DataService>();
        SimpleIoc.Default.Register<IUnitOfWork, UnitOfWork>();
    }
    SimpleIoc.Default.Register<LoginViewModel>();

    // Missing something like this (not sure what interface it implements...)
    SimpleIoc.Default.Register<IConfiguratorContext, BomConfiguratorContext>();
}
...