2013-06-21 3 views
0

Я новичок в. Net Technologies, и я хотел начать с многоуровневого приложения в качестве теста для Unity и WPF. При выполнении я получаю следующее исключение: ConfigurationErrorsException: Не найдено никаких действительных атрибутов для создания значения параметра mefRepository . Проверьте конфигурационный файл. Ниже конфигурация Unity:Использование контейнера MS Unity DI и WPF в многоуровневом приложении

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> 
<typeAliases> 
<typeAlias alias="IUnitOfWork" type="DDDTest.Domain.Core.IUnitOfWork,DDDTest.Domain.Core"/> 
    <typeAlias alias="UnitOfWork"  type="DDDTest.Infrastructure.Data.MainModule.UnitOfWork,DDDTest.Infrastructure.Data.MainModule"/> 
    <typeAlias alias="IRepository" type="DDDTest.Domain.Core.IRepository,DDDTest.Domain.Core"/> 
    <typeAlias alias="Repository"  type="DDDTest.Infrastructure.Data.MainModule.Repository,DDDTest.Infrastructure.Data.MainModule"/> 
    <typeAlias alias="IMefRepository" type="DDDTest.Domain.MainModule.Entities.IMefRepository,DDDTest.Domain.MainModule.Entities"/> 
    <typeAlias alias="MefRepository" type="DDDTest.Infrastructure.Data.MainModule.Repositories.MefRepository,DDDTest.Infrastructure.Data.MainModule.Repositories"/> 
    <typeAlias alias="IMefService" type="DDDTest.Domain.MainModule.Services.IMefService,DDDTest.Domain.MainModule.Services"/> 
    <typeAlias alias="MefService"  type="DDDTest.Domain.MainModule.Services.MefService,DDDTest.Domain.MainModule.Services"/> 
    </typeAliases> 
    <container> 
    <register type ="IUnitOfWork"  mapTo="UnitOfWork" name="UoW"/> 
    <register type="IRepository"  mapTo="Repository"> 
    <constructor> 
     <param name="uow" dependencyName="UoW"/> 
    </constructor> 
    </register> 
    <register type ="IMefRepository" mapTo="MefRepository" name="MefRepo"/> 
    <register type ="IMefService"  mapTo="MefService"> 
    <constructor> 
     <param name="mefRepository" dependenceyName="MefRepo"/> 
     <param name="mefRepository" dependenceyType="MefRepository"/> 
     </constructor> 
     </register> 
     </container> 
    </unity> 

И MefService класс выглядит следующим образом:

namespace DDDTest.Domain.MainModule.Services 
{ 
public class MefService : IMefService, IDisposable 
{ 
    IMefRepository _mefRepo; 

    public MefService(IMefRepository mefRepository) 
    { 
     _mefRepo = mefRepository; 

    } 


    //Add New Mef 
    public void AddMef(misfor _mef) 
    { 
     _mefRepo.Add(_mef); 
    } 

    //Delete a mef 
    public void DeleteMef(misfor _mef) 
    { 
     _mefRepo.Remove(_mef); 
    } 

    //Get a new empty mef 
    public misfor GetNewObject() 
    { 
     return _mefRepo.GetNewEmpty(); 
    } 

    //Find Mef By Primary Key 
    public misfor GetById(string ctr, short mef) 
    { 
     return _mefRepo.GetById(ctr, mef); 
    } 

    public void Dispose() 
    { 
     _mefRepo = null; 
    } 

} 

}

и окно WPF выглядит следующим образом:

namespace DDDTest.Presentation.MainModule 
{ 
/// <summary> 
/// Logique d'interaction pour MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 

    IMefRepository _mr; 
    MefService _ms; 
    misfor _currentMef; 

    public IUnityContainer unityContainer; 

    public MainWindow() 
    { 
     InitializeComponent(); 

    } 


    //Initialisation du container unity pour l'injection des dépendances 
    public void InitIocContainer() 
    { 
     unityContainer = new UnityContainer(); 
     unityContainer.LoadConfiguration(); 

    } 



    private void MefCode_KeyDown(object sender, KeyEventArgs e) 
    { 
     string c = txctrCode.Text; 
     short m = short.Parse(txMefCode.Text); 

     if (e.Key == Key.Enter) 
     { 

      _currentMef = _ms.GetById(c, m); 
       if (_currentMef != null) 
        grdMaster.DataContext = _currentMef; 
       else 
        MessageBox.Show("Mise en force introuvable.", "Erreur", MessageBoxButton.OK, MessageBoxImage.Error); 

     } 

    } 



    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     InitIocContainer(); 

     _ms = new MefService(_mr); 

     _currentMef = _ms.GetNewObject(); 
     grdMaster.DataContext = _currentMef; 

    } 
    } 
    } 

Первая проблема заключается в том, что Я не знаю, где инициализировать контейнер Unity. Я нашел много образцов в Сети, но все о Unity и WPF/MVVM. Вторая проблема в том, что я не могу найти источник ошибки, потому что код класса MefService кажется правильным. Ваша помощь приветствуется.

ответ

0

Обычно вы должны инициализировать контейнер при запуске приложения.

С точки зрения ошибки вы видите следующее не выглядит правильно:

<register type ="IMefService"  mapTo="MefService"> 
    <constructor> 
    <param name="mefRepository" dependenceyName="MefRepo"/> 
    <param name="mefRepository" dependenceyType="MefRepository"/> 
    </constructor> 
</register> 

dependenceyName и dependenceyType не являются допустимыми именами атрибутов из-за орфографических опечаток. Кроме того, кажется неправильным иметь два параметра с тем же именем.