我有一个名为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都是最新的。
答案 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";
}