我有一个MEF的CompositionContainer,一个契约(比如IFoo)和一个模块(Prism模块,但这里没什么关系,只是一些组件).我希望在我的模块中注册合同的实现(FooImpl).
如果它是Unity我会这样做:
unity.RegisterType<IFoo, FooImpl>().
Run Code Online (Sandbox Code Playgroud)
就这样.有了MEF,我很困惑.我必须使用ExportAttribute标记我的实现,但这会导致它自动导出.我想自己管理这个.看看代码:
class MyModule: IModule {
private CompositionContainer m_container;
public MyModule(CompositionContainer container) {
m_container = container;
}
public void Initialize() {
??? I want something like m_container.CreateExport<IFoo, FooImpl>()
}
}
public interface IFoo {}
public class FooImpl : IFoo {
//[ImportingConstructor]
public FooImpl(ISomeService svc) {}
}
Run Code Online (Sandbox Code Playgroud)
在Initialize中,我希望manualy 导出 FooImpl,因为IFoo合约不依赖于FooImpl类的ExportAttribute.我知道我只能创建一个实例FooImpl(在上面的MyModule.Initialize中),但是FooImpl对其他组件/服务有构造函数依赖关系,我希望它们在创建时得到解析.
所以我可能会问:如何手动添加具有CompositionContainer实例和合同的导出?然后以某种方式标记此导出,因为它具有ImportingConstructorAttribute?
我想将 @mdi/font 图标捆绑到我的应用程序中(它是一个 Electron 应用程序)。
我安装了npm i @mdi/font --save-dev:
"devDependencies": {
"@mdi/font": "^7.0.96",
}
Run Code Online (Sandbox Code Playgroud)
然后我导入了 css/scss,我尝试了几种不同的方法:
main.ts:import '@mdi/font/css/materialdesignicons.css';main.scss:@import './node_modules/@mdi/font/scss/materialdesignicons.scss';base.css:@import './node_modules/@mdi/font/css/materialdesignicons.css';然后我在标记中使用了 mdi-* css 类:
SideMenu.vue:
<template>
<aside class="menu">
<ul class="action-bar">
<li class="action-item active">
<a class="action-label icon">
<i class="mdi-cog"></i>
</a>
</li>
<li class="action-item">
<a class="action-label icon">
<i class="mdi-home"></i>
</a>
</li>
<li class="action-item">
<a class="action-label icon">
<i class="mdi-content-copy"></i>
</a>
</li>
</ul>
</aside>
</template>
Run Code Online (Sandbox Code Playgroud)
该应用程序启动并运行,但我看到相同的图标。
需要考虑的事项:
给出了两个VSX项目的演示解决方案:1.添加新项目 - >可扩展性 - >项目模板 - "ItemTemplate1"2.添加新项目 - >可扩展性 - > VSIX项目 - "VSIXProject1"
我没有对"ItemTemplate1"进行任何更改,因此它构成了默认项模板(ItemTemplate1.vstemplate):
<VSTemplate Version="3.0.0" Type="Item" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>ItemTemplate1</Name>
<Description><No description available></Description>
<Icon>ItemTemplate1.ico</Icon>
<TemplateID>e298765c-97b8-4f4c-9b7b-a6b368f914df</TemplateID>
<ProjectType>CSharp</ProjectType>
<RequiredFrameworkVersion>2.0</RequiredFrameworkVersion>
<NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>
<DefaultName>Class.cs</DefaultName>
</TemplateData>
<TemplateContent>
<References>
<Reference>
<Assembly>System</Assembly>
</Reference>
</References>
<ProjectItem ReplaceParameters="true">Class.cs</ProjectItem>
</TemplateContent>
</VSTemplate>
Run Code Online (Sandbox Code Playgroud)
在VSIXProject1中,我只编辑了source.extension.vsixmanifest,添加了对ItemTemplates1项目的引用.在此之后,vsixmanifest只包含一个内容描述:
<Content>
<ItemTemplate>ItemTemplates</ItemTemplate>
</Content>
Run Code Online (Sandbox Code Playgroud)
然后建造它.在bin/debug中我得到了VSIXProject1.vsix,在其中我可以在ItemTemplates\CSharp\1033\ItemTemplate1.zip文件中看到我的项目模板.
一切看起来都很棒!
除了它不起作用的事实.我运行VSIXProject1.vsix,安装了vsix(我可以在扩展管理器中看到它),但没有任何模板被复制到"C:\ Users\{UserName}\Documents\Visual Studio 2010\Templates\ItemTemplates"!
给定两个项目:
如您所见,两个项目都有不同的默认命名空间。这是为了资源 - 两个项目都有自己的 resource.resx ,它将具有基于项目默认命名空间的全名。
但是这两个项目都有与“模型”相关的类,所以我希望它们在同一个命名空间中——“Company.Product.Model”。所以我在两个项目中都使用了这个命名空间。
问题是 ReSharper 要求我对“Model.Server”项目中的类使用命名空间“Company.Product.Model.Server”,因为它是默认(基本)命名空间:“命名空间不对应于文件位置...”。
我知道默认情况下它很好。但我想覆盖它 - 并告诉它我所有的类命名空间都基于“Company.Product.Model”而不更改项目的默认命名空间。
是否可以?