2016-03-22 12 views
2

をデバッグする場合にのみ、私は、ドメインオブジェクトにエンティティからマップするためにAutoMapperを使用しています。Automapperパフォーマンスの問題のVisual Studioでの私のWPFアプリケーションで

特定のマッピングでは、アプリケーションをデバッグ(F5)と実行(CTRL + F5)して実行するとかなり遅くなります。このマッピングをデバッグすることなく は< 1秒がかかりますが、デバッグすると、それは〜14秒かかります。 (簡潔にするために簡略化)

ドメインオブジェクト:

public class CompanyModel : UpdateableModel 
{ 
    public CompanyModel() : this(true){} 

    public CompanyModel(bool isNewModel) : base(isNewModel) 
    { 
     Projects = new ObservableCollectionEx<ProjectModel>(); 
     Projects.ItemPropertyChanged += (sender, args) => OnPropertyChanged("Projects"); 
    } 

    public int? Id { get; set;} 
    public string Name { get; set; } 
    public string CompanyXref { get; set; } 
    public bool IsActive { get; set; } 
    public ObservableCollectionEx<ProjectModel> Projects { get; set;} 
    public DateTime? DateUpdated { get; set;} 
} 

public class ProjectModel : UpdateableModel 
{ 
    public ProjectModel() : this(true){} 

    public ProjectModel(bool isNewModel) : base(isNewModel) 
    { 
     Tasks = new ObservableCollectionEx<ProjectTaskModel>(); 

     SetPropertyDefault(() => StartDate, DateTime.Today); 
     SetPropertyDefault(() => EndDate, DateTime.Today); 

     // ReSharper disable once ExplicitCallerInfoArgument 
     Tasks.ItemPropertyChanged += (sender, args) => OnPropertyChanged("Tasks"); 
    } 

    public int? Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
    public string BillingCurrency { get; set; } 
    public string ExternalXref { get; set; } 
    public bool IsChargeable { get; set; }   
    public bool IsActive { get; set; } 
    public int TimeTypeId { get; set; } 
    public ObservableCollectionEx<ProjectTaskModel> Tasks { get; set;} 
    public DateTime? DateUpdated { get; set; } 
} 

public class ProjectTaskModel : UpdateableModel 
{ 
    public ProjectTaskModel() : this(true){} 

    public ProjectTaskModel(bool isNewModel) : base(isNewModel) 
    { 
     SetPropertyDefault(() => StartDate, DateTime.Today); 
     SetPropertyDefault(() => EndDate, DateTime.Today); 
    } 

    public int? Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public DateTime StartDate { get; set; }   
    public DateTime EndDate { get; set; } 
    public string ExternalXref { get; set; } 
    public bool IsActive { get; set; } 
    public DateTime? DateUpdated { get; set; } 
} 

エンティティ:最後のマッピング、すべてのプロパティは、現在、明示的にマッピングされている

public class CompanyEntity : BaseEntity 
{ 
    public virtual string CompanyName { get; set; } 
    public virtual string CompanyXref { get; set; } 
    public virtual bool IsActive { get; set; } 
    public virtual IList<ProjectEntity> Projects { get; set; } 

    public virtual DateTime? DateUpdated { get; set; } 
} 

public class ProjectEntity : BaseEntity 
{ 
    public virtual string ProjectName { get; set; } 
    public virtual string Description { get; set; } 
    public virtual DateTime StartDate { get; set; } 
    public virtual DateTime EndDate { get; set; } 
    public virtual string ExternalXref { get; set; } 
    public virtual bool IsChargeable { get; set; } 
    public virtual bool IsActive { get; set; } 

    public virtual int TimeTypeId { get; set; } 
    public virtual string CurrencyId { get; set; } 

    public virtual CompanyEntity ClientCompany { get; set; } 
    public virtual DateTime? DateUpdated { get; set; } 

    public virtual IList<ProjectTaskEntity> Tasks { get; set; } 
} 

public class ProjectTaskEntity : BaseEntity 
{ 
    public virtual string ProjectTaskName { get; set; } 
    public virtual string Description { get; set; } 
    public virtual DateTime StartDate { get; set; } 
    public virtual DateTime EndDate { get; set; } 
    public virtual string ExternalXref { get; set; } 
    public virtual bool IsActive { get; set; } 

    public virtual DateTime? DateUpdated { get; set; } 

    public virtual ProjectEntity Project { get; set; } 
} 

CreateMap<CompanyEntity, CompanyModel>() 
    .ConstructUsing((CompanyEntity src) => new CompanyModel(false)) 
    .MapMember(dest => dest.Id, src => src.Id) 
    .MapMember(dest => dest.Name, src => src.CompanyName) 
    .MapMember(dest => dest.CompanyXref, src => src.CompanyXref) 
    .MapMember(dest => dest.IsActive, src => src.IsActive) 
    .MapMember(dest => dest.Projects, src => src.Projects) 
    .IgnoreMember(dest => dest.State); 

CreateMap<ProjectEntity, ProjectModel>() 
    .ConstructUsing((ProjectEntity src) => new ProjectModel(false)) 
    .MapMember(dest => dest.Id, src => src.Id) 
    .MapMember(dest => dest.Name, src => src.ProjectName) 
    .MapMember(dest => dest.Description, src => src.Description) 
    .MapMember(dest => dest.BillingCurrency, src => src.CurrencyId) 
    .MapMember(dest => dest.StartDate, src => src.StartDate) 
    .MapMember(dest => dest.EndDate, src => src.EndDate) 
    .MapMember(dest => dest.ExternalXref, src => src.ExternalXref) 
    .MapMember(dest => dest.IsActive, src => src.IsActive) 
    .MapMember(dest => dest.IsChargeable, src => src.IsChargeable) 
    .MapMember(dest => dest.Tasks, src => src.Tasks) 
    .MapMember(dest => dest.TimeTypeId, src => src.TimeTypeId) 
    .IgnoreMember(dest => dest.State); 

CreateMap<ProjectTaskEntity, ProjectTaskModel>() 
    .ConstructUsing((ProjectTaskEntity src) => new ProjectTaskModel(false)) 
    .MapMember(dest => dest.Id, src => src.Id) 
    .MapMember(dest => dest.Name, src => src.ProjectTaskName) 
    .MapMember(dest => dest.Description, src => src.Description) 
    .MapMember(dest => dest.StartDate, src => src.StartDate) 
    .MapMember(dest => dest.EndDate, src => src.EndDate) 
    .MapMember(dest => dest.ExternalXref, src => src.ExternalXref) 
    .MapMember(dest => dest.IsActive, src => src.IsActive) 
    .IgnoreMember(dest => dest.State); 

マッピングは16の企業、122の合計プロジェクトが実行され、各プロジェクトには1つしかありませんタスクは現在ありません。

マッピングのさまざまなプロパティを無視しようとしましたが、これはプロジェクトレベルでこれを引き起こしているタスクコレクションのようです。無視すると、マッピングは14秒ではなく2秒かかります。

Visual Studioでこのパフォーマンスの問題を引き起こす可能性のあるデバッグ用のアプリケーションをホストする方法はありますか?

+0

この問題は、AutoMapperとデバッガの間のやり取りではなく、NHibernateとデバッガとの相互作用ではないと考え始めています。 – Phaeze

答えて

0

あなたはおそらく別のCSHARP IDEがデバッグモードでそれを実行し、違いがあるかどうかを確認ダウンロードできます。 SharpDevはオープンソースのIDEで、とてもいいですし、C#プロジェクトをサポートしています。

http://www.icsharpcode.net/OpenSource/SD/Download/

それは、少なくとも面白いと代替を試すための簡単な方法でしょう。 SharpDevには、問題の内容を示すコードプロファイラが組み込まれています。

幸運。

+0

残念ながら、私のアプリケーションは4.6を使用しているので、これはオプションではありません。また、あなたのプロファイリングのコメントに関しては、ビジュアルスタジオ2015は同じ機能を持っていますが、私はそれから何らかの情報を収集することができませんでした。 – Phaeze

+0

@Phaezeそれは残念ですSharpDevはまだ4.6をサポートしていません。 SharpDevプロジェクトを作成し、すべてのクラスとNuget ObservableCollectionExを追加しました。私はBaseEntityとUpdateable Modelが必要であることを除いてプロジェクトを構築できます。 – raddevus

+0

ベースエンティティにはIDプロパティが含まれており、更新可能なモデルコードはhttps://github.com/MadillJ/InterstingCodeCollection/blobに掲載しています。 /master/UpdateableModel.csそれはいくつかのC#6の機能を使用しています – Phaeze

関連する問題