7

ログ ライブラリを修正しようとしています。ここが私が立ち往生している場所です。UserLogin、PurchaseOrder などの何百もの操作を識別するために、列挙型 (ActionType と呼びましょう) を使用します。そして、ロガー メソッドでこの型を使用します。しかし、疎結合のためにプロジェクト固有のコードからロガー ライブラリを分離していて、ベース ライブラリがプロジェクトで定義された ActionType にアクセスできないため、どうすればこれを達成できますか。それを明確にするために、Javaで同じケースを説明しましょう。Java では、列挙型でインターフェイスを実装できます。だから私は書くことができます:

基本ロガー ライブラリで定義できます。

public interface IActionType {}

そして私のいくつかのプロジェクトの1つで

public enum ActionType implements IActionType {UserLogin, PurchaseOrder, .....}

したがって、 logger.log(ActionType.UserLogin, ....)ベース ライブラリを呼び出すと、基になるアクションが取得されます。これで十分でしょう。C#でこれを達成するためにとにかくそれの周りにありますか? ところで、IoC コンテナの使用も検討しましたが、もっとエレガントなものが欲しいです。

助けてくれてありがとう...

4

3 に答える 3

3

レイジーは私を打ち負かしましたが、とにかく私の解決策を投稿します

public void MyUsage(ITypesafeEnum myEnum)
{
    Console.WriteLine(myEnum.Name);
    Console.WriteLine(myEnum.Val);
}

public interface ITypesafeEnum{
    string Name{get;}
    int Val {get;}
}

public  class TypesafeEnum:ITypesafeEnum{

    public string Name {get;private set;}
    public int Val {get;private set;}
    private TypesafeEnum(){}
    private TypesafeEnum(string name, int val){
        Name = name;
        Val = val;
    }

    public static readonly TypesafeEnum Bedroom = new TypesafeEnum("Bedroom", 1);
    public static readonly TypesafeEnum LivingRoom = new TypesafeEnum("Living Room",2);
}
于 2013-01-11T22:07:27.270 に答える
3

これはlog4netがLevelクラスに使用するアプローチです(はい、列挙型ではなくクラスです):

public class ActionType : IActionType
{
   public static readonly ActionType UserLogin;
   public static readonly ActionType PurchaseOrder;

   static ActionType()
   {
       UserLogin = new ActionType(1, "User Login");
       // ...
   }

   public ActionType(int value, string name)
   {           
       // verify arguments values
       Value = value;
       Name = name;
   }

   public int Value { get; private set; }
   public string Name { get; private set; }
}

そしてインターフェース

public interface IActionType
{
    int Value { get; }
    string Name { get; }
}

使用法:

logger.Log(ActionType.UserLogin);
于 2013-01-11T21:34:03.057 に答える
1

ジェネリックを使用する別のアプローチを次に示します。

public void Log<EnumType>(EnumType enumMember)
{
    var name = enumMember.ToString();
    int value = (int)(object)enumMember;
    Console.WriteLine(name + " = " + value);
}

上記のメソッドを次のように呼び出します。

Log<ActionType>(ActionType.UserLogin);
Log<ActionType>(ActionType.PurchaseOrder);

次のような出力が得られます。

UserLogin = 0
PurchaseOrder = 1
于 2013-01-11T22:04:25.083 に答える