0

私はこのようにプロジェクトを構造化しています: データ層 - モデル用 MVC ウェブサイト - 関連する他のすべての mvc ウェブサイト用。

コントローラーでデータベース コンテキストとサービスを同時に注入し、依存性注入を確実に行いたいと考えています。

ここに私のコードがあります私のコントローラ:

  private CMSDB _db;
    public HomeController(CMSDB db)
    {
        _db = db;
    }

マイ データベース コンテキスト

  public class CMSDB : DbContext
{
    public CMSDB() : base("DefaultConnection"){   }
    public DbSet<Employee> Employees { get; set; }
    public DbSet<Department> Departments { get; set; }
    public DbSet<UserDatails> Users { get; set; }
    public DbSet<UserRole> UserRoles { get; set; }
    public DbSet<Module> Modules { get; set; }
}

別のプロジェクトのモデル

 public class Module : IModule
{
   public virtual int ID { get; set; }
   public virtual string Name { get; set; }
   public virtual DateTime? DateCreated { get; set; }
   public virtual string ModuleDescription { get; set; }
} 

モデルと同じプロジェクトの私のインターフェース

 public interface IModule
 {    }

コントローラーで CMSDB と IModule を同時に注入し、依存性注入を確実に行いたいと考えています。

重要な要素は、後でこれから他のソリューション (おそらくポータル) を分離できることです。すべての意見を歓迎します。

4

2 に答える 2

1

正解としてマークされた回答は機能しますが、この特定の質問は StructureMap 3 に関連しているため、StructureMap の使用ObjectFactoryは推奨されておらず、実際にはバージョン 4 で非推奨になっていることに言及する価値があります (ビルドしようとすると間違いなくわかるように)あなたの解決策)。

代わりに、StructureMap のIContainerインターフェイスを使用して、以下のソリューションを介して依存関係を構成することをお勧めします。

var container = new Container(x => {
    x.For<IInterface>().Use<ConcreteClass>();
    x.For<IInterface2>().Use<ConcreteClass2>();
}); 

再利用性について具体的に言及しているように、レジストリ内の依存関係を次のようにカプセル化できるStructureMap のレジストリ クラスを確認することをお勧めします。

public class WebsiteRegistry : Registry
{
    public WebsiteRegistry()
    {
        For<ICustomerService>().Use<CustomerService>();
        For<IProductServer>().Use<ProductService>();
    }
}

次に、次のようにして、同じ方法でレジストリ クラスを作成および登録できます。

IContainer container = new Container(x =>
{
    x.AddRegistry<DatabaseRegistry>();
    x.AddRegistry<WebsiteRegistry>();
});

この方法の利点は、レジストリ クラスをコア依存関係、Web サイト ベースの依存関係、および Web サービスの依存関係に分割できることです。たとえば、Web サイトと Web サービスの両方がデータベース アクセスを必要とするため、これはコア レジストリに入る可能性がありますがSessionRegistry、Web サービスでは役に立たない が必要になる場合があります (Web サービスのセッションレスの性質のため)。

Global.asax.cs次に、StructureMap をクラス内の ASP.NET MVC の依存関係リゾルバーに登録するだけです。

于 2014-10-22T22:37:31.903 に答える
1

起動時に実行する必要があるマッピングを作成していることを確認してください

   public static class ContainerBootstrapper
    {
        public static void BootstrapStructureMap()
        {
            // Initialize the static ObjectFactory container
            ObjectFactory.Initialize(x =>
            {
                x.ForRequestedType<iNTERFACE>().TheDefaultIsConcreteType<ContreteClass>();
            });
        }
    }

それから

  iNTERFACE objectINMVCController = ObjectFactory.GetInstance<iNTERFACE>();
于 2014-10-05T01:54:28.660 に答える