0

シリアル化に問題があります。正当な理由でメソッドをシリアル化できないことを理解しているので、既存のクラスをより管理しやすいクラスに変換するファクトリ クラスを作成しました。

これは元のクラスです:

using Assets.Components;
using Assets.Data;
using IO.Components;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace Assets
{
[Serializable]
public class Asset
{

    #region Fields

    Metadata _metadata;
    string _fileName;
    string _companyId;

    #endregion

    #region Properties

    [Required]
    public string DisplayName { get; set; }
    public string Description { get; set; }
    public string Tags { get; set; }

    public int Id { get; set; }
    public int CategoryId { get; set; }
    public AssetType Type { get; set; }
    public int LanguageId { get; set; }
    public int StatusId { get; set; }

    public DateTime DateCreated { get; set; }
    public long DateCreatedMilliseconds { get { return DateCreated.ToJavaScriptMilliseconds(); } }

    public int Views { get; set; }
    public int Downloads { get; set; }

    public string ThumbNail { get; set; }

    public string Filename
    {
        set { _fileName = value; }
    }

    [Required]
    public string CompanyId
    {
        set { _companyId = value; }
    }


    public string GetBaseDirectory
    {
        get { return "/Public/Uploads/" + this._companyId + "/0"; }
    }

    public double Rating
    {
        get
        {
            List<int> Score = new List<int>();

            foreach (IRating oRating in this.Ratings())
            {
                Score.Add(oRating.Score);
            }

            return (Score.Count > 0) ? Score.Average() : 0;
        }
    }

    public Metadata Metadata
    {
        get
        {
            if (_metadata == null)
            {
                _metadata = new Metadata(this.Id);
                if (_metadata.AssetId == 0)
                {
                    try
                    {
                        if (GetFilename() != null)
                        {
                            string path = System.IO.Path.Combine(HttpContext.Current.Server.MapPath(this.GetBaseDirectory), GetFilename());
                            if (!System.IO.File.Exists(path))
                                _metadata = new Metadata();
                            else
                            {
                                _metadata = MetadataExtractor.Create(path, this.Id);
                                _metadata.save();
                            }
                        }
                        else
                        {
                            _metadata = new Metadata();
                        }
                    }
                    catch
                    {
                        _metadata = new Metadata();
                    }
                }
            }
            return _metadata;
        }
    }

    public bool IsConverted { get; set; }
    public string UserId { get; set; }

    public DateTime DateModified { get; set; }

    public long DateModifiedMilliseconds { get { return DateCreated.ToJavaScriptMilliseconds(); } }


    public string Culture { get; set; }
    public string Language { get; set; }

    public string UserName { get; set; }
    public string Email { get; set; }

    public int CategoryCount { get; set; }
    public int AssetCount { get; set; }

    public bool IgnoreRights { get; set; }

    #endregion

    #region Contructors

    /// <summary>
    /// Default constructor
    /// </summary>
    public Asset()
    {
    }

    /// <summary>
    /// Get's the asset from the database, but set's the status to the profiles Requires Approval state.
    /// </summary>
    /// <param name="Id">Asset Id</param>
    /// <param name="IsViewing">Boolean to update the reports table</param>
    /// <param name="IsDownloading">Boolean to update the reports table</param>
    public Asset(int Id, string UserId, string CompanyId, bool IsViewing, bool IsDownloading)
    {
        try
        {
            Asset oAsset = AssetData.GetAsset(Id, IsViewing, IsDownloading, UserId, CompanyId);          

            // Assign the values to this class
            this.Id = oAsset.Id;
            this.DisplayName = oAsset.DisplayName;

            this.IsConverted = oAsset.IsConverted;
            this.StatusId = oAsset.StatusId;
            this.Type = oAsset.Type;

            this.UserId = oAsset.UserId;
            this.UserName = oAsset.UserName;
            this.CompanyId = oAsset.GetCompanyId();

            this.Description = oAsset.Description;
            this.Tags = oAsset.Tags;

            this.LanguageId = oAsset.LanguageId;
            this.Culture = oAsset.Culture;
            this.Language = oAsset.Language;

            if (oAsset.ThumbNail != null) this.ThumbNail = oAsset.ThumbNail;
            this.Filename = oAsset.GetFilename();
            if (oAsset.Views != 0) this.Views = oAsset.Views;
            if (oAsset.Downloads != 0) this.Downloads = oAsset.Downloads;
        }
        catch (Exception ex)
        {
            Stars.BLL.Error.Handling.LogError("Skipstone", "Asset", "Asset", ex.Message, ex.ToString()); // Record our error
        }
    }

    /// <summary>
    /// Used for executing some of the public methods
    /// </summary>
    /// <param name="Id">Id of the asset to retrieve</param>
    /// <param name="CompanyId">The CompanyId of the company for the User</param>
    public Asset(int Id, string CompanyId)
    {
        this.Id = Id;
        this.CompanyId = CompanyId;
    }

    #endregion

    #region Public methods

    public string GetCompanyId()
    {
        return _companyId;
    }

    public string GetFilename()
    {
        return _fileName;
    }

    public string GetThumbnail()
    {
        return this.GetBaseDirectory + "/" + this.ThumbNail;
    }

    public string GetSmallThumbnail()
    {
        return this.GetBaseDirectory + "/sml_" + this.ThumbNail;
    }

    public Collection<IRating> Ratings()
    {
        Collection<IRating> oRatings = new Collection<IRating>();
        try
        {
            oRatings = RatingData.get(this.Id);
        }
        catch
        {
            // record our error
        }
        return oRatings;
    }

    public Collection<IComment> Comments()
    {
        Collection<IComment> oComments = new Collection<IComment>();
        try
        {
            oComments = CommentData.getAssetComments(this.Id);
        }
        catch (Exception ex)
        {
            // record our error
        }
        return oComments;
    }

    public void SaveMetadata()
    {
    }

    public Collection<GenericType> Categories()
    {
        return MiscellaneousManager.AssetCategories(this.Id, GetCompanyId());
    }

    public void Save()
    {
        if (this.Id > 0)
        {
            AssetData.update(this);
        }
        else
        {
            Asset oAsset = AssetData.create(this);
            this.Id = oAsset.Id;
            this.DisplayName = oAsset.DisplayName;
            this.Type = oAsset.Type;

            this.UserId = oAsset.UserId;
            this.CompanyId = oAsset.GetCompanyId();

            this.Description = oAsset.Description;
            this.Tags = oAsset.Tags;

            this.LanguageId = oAsset.LanguageId;
            this.Culture = oAsset.Culture;
            this.Language = oAsset.Language;

            if (oAsset.ThumbNail != null) this.ThumbNail = oAsset.ThumbNail;
            this.Filename = oAsset.GetFilename();
            if (oAsset.Views != 0) this.Views = oAsset.Views;
            if (oAsset.Downloads != 0) this.Downloads = oAsset.Downloads;
        }
    }

    public void delete()
    {
        AssetData.delete(this.Id);
        AssetManager.RemoveFromCache(this);
    }

    #endregion

}
}

これは私のファクトリーメソッドです:

    private static SerialisedAsset AssetFactory(Assets.Asset Object)
    {
        SerialisedAsset FactoryObject = new SerialisedAsset()
        {
            Id = Object.Id,
            Name = Object.DisplayName,
            UserId = Object.UserId,
            UserName = Object.UserName,
            CompanyId = Object.GetCompanyId(),
            Description = Object.Description,
            Tags = Object.Tags,
            DateCreated = Object.DateCreated,
            Path = Object.GetBaseDirectory,
            FileName = Object.GetFilename(),
            ThumbnailName = Object.ThumbNail
        };

        return FactoryObject;
    }

これは私の audittrailmanager クラスの一部です:

using Assets;
using Core;
using Reports.Objects;
using System;
using System.IO;
using System.Xml.Serialization;

namespace Reports.Components
{
public static class AuditTrailManager
{

    #region Public methods

    public static Audit AuditTrailFactory(Profile Profile, Object Object, Event Event)
    {
        Audit Audit = new Audit(SerializeObject(Object))
        {
            UserId = Profile.UserId,
            UserName = Profile.UserName,
            CompanyId = Profile.CompanyId,
            ObjectName = GetObjectNameFromType(Object.GetType().ToString()),
            Event = Event
        };

        return Audit;
    }

    #endregion

    #region Private methods

    private static string GetObjectNameFromType(string Type)
    {
        switch (Type)
        {
            case "Assets.Asset": return "Asset";
            case "Core.SiteSetting": return "CompanySettings";
        }

        return "";
    }

    private static string SerializeObject(Object Object)
    {
        string ObjectType = Object.GetType().ToString();

        switch (ObjectType)
        {
            case "Assets.Asset": return Serialize(AssetFactory((Asset)Object));
        }

        return ""; // If we fail
    }

    private static string Serialize(Object Object)
    {
        XmlSerializer ser = new XmlSerializer(Object.GetType());
        using (StringWriter Xml = new StringWriter())
        {
            ser.Serialize(Xml, Object);
            return (Xml.ToString());
        }
    }

    private static SerialisedAsset AssetFactory(Assets.Asset Object)
    {
        SerialisedAsset FactoryObject = new SerialisedAsset()
        {
            Id = Object.Id,
            Name = Object.DisplayName,
            UserId = Object.UserId,
            UserName = Object.UserName,
            CompanyId = Object.GetCompanyId(),
            Description = Object.Description,
            Tags = Object.Tags,
            DateCreated = Object.DateCreated,
            Path = Object.GetBaseDirectory,
            FileName = Object.GetFilename(),
            ThumbnailName = Object.ThumbNail
        };

        return FactoryObject;
    }

    #endregion

}
}

私がやろうとしているのは、作業中のオブジェクト (この場合は資産) を記録する監査証跡を作成し、クラスをシリアル化し、レポートなどで使用するためにデータベースに挿入することです。

私の質問は; これはそれを行う方法です。より良い方法はありますか?

4

0 に答える 0