在分层应用程序中使用MS Unity DI Container和WPF

时间:2013-06-21 11:22:26

标签: wpf dependency-injection unity-container

我是.Net Technologies的新手,我想从分层应用程序开始,作为Unity和WPF的测试。执行时我得到以下异常:ConfigurationErrorsException: 找不到有效的属性来构造参数mefRepository的值 请检查配置文件。 Unity配置下方:

<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类的代码似乎是正确的。 欢迎您的帮助。

1 个答案:

答案 0 :(得分:0)

通常您会在应用程序启动时初始化容器。

就错误而言,您会发现以下内容看起来不正确:

<register type ="IMefService"     mapTo="MefService">
  <constructor>
    <param name="mefRepository" dependenceyName="MefRepo"/>
    <param name="mefRepository" dependenceyType="MefRepository"/>
  </constructor>
</register>  
由于拼写错别字,

dependencyyName和dependenceyType不是有效的属性名称。另外,有两个具有相同名称的参数似乎是错误的。