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

确保您正在创建应该在启动时运行的映射

   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 回答
1

虽然标记为正确答案的答案会起作用,因为这个特定的问题与 StructureMap 3 相关,但值得一提的ObjectFactory是,不建议使用 StructureMap 并且实际上在版本 4 中已弃用(当您尝试构建时,您无疑会看到)你的解决方案)。

相反,更好的选择是使用 StructureMap 的IContainer接口通过以下解决方案组合您的依赖项:

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

当您特别提到可重用性时,我建议您查看StructureMap 的 Registry 类,这些类允许您将依赖项封装在注册表中,如下所示:

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 服务都需要数据库访问,因此这可以进入核心注册表,但是您的网站可能需要SessionRegistry在 Web 服务中无用的数据库(由于 Web 服务的无会话性质)。

然后,您只需在Global.asax.cs类中使用 ASP.NET MVC 的依赖解析器注册 StructureMap。

于 2014-10-22T22:37:31.903 回答