2017-10-23 10 views
0

を介して公開単一インスタンスオブジェクトのカスタムデリゲートは、以下のコード考えてみましょう:私はProductFactoryデリゲートを呼び出すことによって誰かによって作成される、IProductのための単一のインスタンスを維持する必要がAutofac:インタフェース

public interface IProduct { }; 

public class ConcreteProduct : IProduct 
{ 
    public ConcreteProduct(int id, DateTime manufacturedDate, DateTime expiryDate) 
    { 

    } 
} 

public delegate IProduct ProductFactory(int id, DateTime manufacturedDate, DateTime expiryDate); 

を、 ConcreteProductを返します。

これを達成する方法をAutofacで提案してください。

+1

データオブジェクト(DTO、エンティティ、メッセージなど)を作成するのはオートファックの仕事ではありません。 DIコンテナの仕事は、アプリケーションコンポーネント(アプリケーションの動作を保持するクラス)のオブジェクトグラフを作成することです。 – Steven

答えて

0

以下試してください:

public delegate IProduct ProductFactory(int id, DateTime manufacturedDate, DateTime expiryDate); 

public interface IProduct { }; 

public class ConcreteProduct : IProduct 
{ 
    public int ProductId { get; set; } 
    public DateTime ManufactureDt { get; set; } 
    public DateTime ExpiryDt { get; set; } 
    public ConcreteProduct(int id, DateTime manufacturedDate, DateTime expiryDate) 
    { 
     ProductId = id; 
     ManufactureDt = manufacturedDate; 
     ExpiryDt = expiryDate; 
    } 
} 

//Class where Factory is injected 
public class ProductOrder 
{ 
    private readonly ProductFactory _prodFactory; 
    public ProductOrder(ProductFactory prodFactory) 
    { 
     _prodFactory = prodFactory; 
    } 

    public IProduct GenerateOrder() 
    { 
     return _prodFactory.Invoke(10, DateTime.Now, DateTime.Now.AddDays(4)); 
    } 
} 

Autofac登録:

static IContainer container; 

    private static void InitializeAutoFac() 
    { 
     var builder = new ContainerBuilder(); 

     builder.Register<ProductFactory>(context => 
     { 
      return (int id, DateTime dt, DateTime dt2) => 
      { 
       IProduct prod = new ConcreteProduct(id, dt, dt2); 
       return prod; 
      }; 
     }).SingleInstance(); 

     builder.RegisterType<ProductOrder>().AsSelf(); 

     container = builder.Build(); 
    } 

使用法:

static void Main() 
{ 
    InitializeAutoFac(); 

    ProductOrder pOrder = container.Resolve<ProductOrder>(); 
    IProduct prod = pOrder.GenerateOrder(); 
} 

はそれがお役に立てば幸いです。