将Autofac与Prism模块配合使用

时间:2015-08-17 18:36:57

标签: c# prism autofac

我有一个名为ModuleA的模块。我创建了一个资源字典文件,将我的应用程序指向适当的位置,在我的Bootstraper.cs文件中,我输入了以下代码:

protected override IModuleCatalog CreateModuleCatalog() {
            return Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(
                new Uri("/MyProject;component/ModCatalog.xaml", UriKind.Relative));
        }

当我运行应用程序时,我得到了这个例外:

所请求的服务' ModuleA'尚未注册。

这条消息对我来说非常清楚,但我该如何解决这个问题呢?我故意创建了一个资源字典 - 我不想在主项目中明确添加依赖项。我是否必须在我的主项目中使用Autofac注册此类型(因此在引用中添加它)?

Prism版本和Autofac都是最新的。

1 个答案:

答案 0 :(得分:0)

你需要覆盖你自己的引导程序中的方法,

ALTER PROCEDURE [dbo].[usp_Get_TimesheetDetails]
    @UserID int, @startdate datetime, @enddate datetime
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

declare @intStartDate int
declare @intEndDate int, @diff int
declare @strMonth varchar(50)

    Select @intStartDate =   DATEPART(day, @startDate) 

    Select @intEndDate = DATEPART(day, @endDate)

    select @strMonth =  DATENAME(MONTH, GETDATE())

Declare @temptable table (num date )

Declare @columns varchar(max)
DECLARE @sqlText nvarchar(1000); 
DECLARE @startnum INT = @intStartDate-1
DECLARE @endnum INT = @intEndDate


select @diff =  DATEDIFF(MONTH, @startdate, @enddate)



     ;WITH gen AS (
         SELECT @startdate AS num
         UNION ALL
         SELECT DATEADD(DAY,1,num) FROM gen 
         WHERE DATEADD(DAY,1,num) <= @enddate
         )
      insert into @temptable SELECT  num  FROM gen
      option (maxrecursion 10000)
      set @columns=
      (SELECT distinct  
              STUFF((SELECT ',' + CAST( DATEPART(DAY, num) as varchar(100)) [text()]
              FROM @temptable 

              FOR XML PATH(''), TYPE)
              .value('.','NVARCHAR(MAX)'),1,2,' ') List_Output
              FROM @temptable t)

      if(@startnum < 10)
      BEGIN 

      SET @sqlText = N'SELECT ' + STUFF(REPLACE(@columns,',','],['),1,3,'') + ']' + ' FROM dbo.timesheet where month ='''+ @strMonth+''' and [Task ID] in(select TaskID from ManageTasks where TeamMemberUserID ='+  Cast(@UserID AS VARCHAR(max)) +')'
      print @sqlText
      END
      else if(@startnum >= 10)
      BEGIN
      SET @sqlText = N'SELECT ' + STUFF(REPLACE(@columns,',','],['),1,4,'') + ']' + ' FROM dbo.timesheet where month ='''+ @strMonth+''' and [Task ID] in(select TaskID from ManageTasks where TeamMemberUserID ='+  Cast(@UserID AS VARCHAR(max)) +')'
      END
      print @sqlText
      Exec (@sqlText)
      end
end

这将告诉您的主项目在哪里寻找模块

然后你需要右键单击你的每个模块和其他项目(而不是主项目),并指定构建事件(只是构建后事件命令行),它将告诉每个模块在哪里放置它的dll,所以主项目可以找到它。

构建事件看起来像这样

xcopy / y“$(TargetPath)”“$(SolutionDir)NameOfYourProject \ $(OutDir)Modules \”

如果你在文件资源管理器中创建bin-&gt;调试名为Module的新文件夹,它应该全部工作。只需确保所有项目都从post build事件指向该位置。

现在,无论何时构建它都会将dll输出到该公共位置

我希望这会有所帮助:)

编辑

    protected override IModuleCatalog CreateModuleCatalog()
    {
        return new PrioritisedDirectoryModuleCatalog();
    }

    protected override void ConfigureModuleCatalog()
    {
        ((DirectoryModuleCatalog)ModuleCatalog).ModulePath = @".\Modules";
    }