[seasar-dotnet:1281] Dxoを使用する際にあるメソッドへのDatePatternAttribute の指定が、指定されていないメソッドに影響する

Nobutaka Ishimori [E-MAIL ADDRESS DELETED]
2009年 3月 26日 (木) 17:55:54 JST


お世話になっております、石守と申します。

Seasar.NetのDXOでDatePatternAtributeを使用する際に、
不具合と考えられる問題に遭遇いたしましたので、報告いたします。

あるメソッドへのDatePatternAttribute の指定が
指定されていないメソッドに影響します。
末尾に再現コードを添えておりますので、ご確認ください。

[問題となる現象]
DatePatternAttributeのついたDXOのメソッドを実行した後、
DatePatternAttributeのついていないDXOのメソッドを実行した際に、
直近に実行したDatePatternAttributeのついたDXOのメソッドの
DatePatternAttributeの内容で処理が実行されます。

・再現コードの実行結果
Original Value               : 2009/04/10 0:00:00
Converted Without DatePattern: 2009/04/10 0:00:00
Converted With DatePattern   : 20090410
Converted Without DatePattern: 20090410

[期待する結果]
他のメソッドのDatePatternAttributeの影響をうけない

・再現コードの期待する実行結果
Original Value               : 2009/04/10 0:00:00
Converted Without DatePattern: 2009/04/10 0:00:00
Converted With DatePattern   : 20090410
Converted Without DatePattern: 2009/04/10 0:00:00

[環境]
Visual C# 2005
Seasar.Net 1.3.14

以上、よろしくお願いいたします。

--
Program.cs
--
using System;
using System.Collections.Generic;
using System.Text;

using Seasar.Quill;
using Seasar.Quill.Attrs;
using Seasar.Dxo.Interceptor;
using Seasar.Dxo.Annotation;

namespace DateFormatLeak
{
    class Program
    {
        static void Main(string[] args)
        {
            DateFormatLeakDxo dxo =
QuillInjector.GetInstance().Container.GetComponent(typeof(DateFormatLeakDxo))
                .GetComponentObject(typeof(DateFormatLeakDxo)) as
DateFormatLeakDxo;

            DateValueDateTime dateTimeValue = new DateValueDateTime();
            dateTimeValue.DateValue = new DateTime(2009, 04, 10);
            // 2009/04/10 0:00:00 と出力
            Console.WriteLine(string.Format("Original Value
   : {0}", dateTimeValue.DateValue.ToString()));

            DateValueString stringValue;
            stringValue = dxo.ConvertWithoutDatePattern(dateTimeValue);
            // 2009/04/10 0:00:00 と出力
            Console.WriteLine(string.Format("Converted Without
DatePattern: {0}", stringValue.DateValue));

            // 20090410 と指定
            stringValue = dxo.ConvertWithDatePattern(dateTimeValue);
            Console.WriteLine(string.Format("Converted With
DatePattern   : {0}", stringValue.DateValue));

            stringValue = dxo.ConvertWithoutDatePattern(dateTimeValue);
            // 20090410 になる
            Console.WriteLine(string.Format("Converted Without
DatePattern: {0}", stringValue.DateValue));

            Console.Write("終了するには 'Enter' を押してください");
            Console.ReadLine();
        }
    }

    /// <summary>
    /// Dxoクラス
    /// </summary>
    [Aspect(typeof(DxoInterceptor))]
    [Implementation]
    public interface DateFormatLeakDxo
    {
        /// <summary>
        /// DatePatternなしの変換
        /// </summary>
        /// <param name="dateTime">日付</param>
        /// <returns>日付の文字列</returns>
        DateValueString ConvertWithoutDatePattern(DateValueDateTime dateTime);

        /// <summary>
        /// DatePatternありの変換
        /// </summary>
        /// <param name="dateTime">日付</param>
        /// <returns>日付の文字列</returns>
        [DatePattern("yyyyMMdd")]
        DateValueString ConvertWithDatePattern(DateValueDateTime dateTime);
    }

    /// <summary>
    /// 日付を文字列でもつ
    /// </summary>
    public class DateValueString
    {
        private string dateValue;
        /// <summary>
        /// 日付文字列
        /// </summary>
        public string DateValue
        {
            get { return dateValue; }
            set { dateValue = value; }
        }

    }
    /// <summary>
    /// 日付をDateTimeでもつ
    /// </summary>
    public class DateValueDateTime
    {
        private DateTime dateValue;
        /// <summary>
        /// 日付文字列
        /// </summary>
        public DateTime DateValue
        {
            get { return dateValue; }
            set { dateValue = value; }
        }

    }
}

--
石守伸崇
[E-MAIL ADDRESS DELETED]


seasar-dotnet メーリングリストの案内