我在这里看到了关于这个论点的各种其他问题,最值得注意的是
Ioc/DI - 为什么我必须在输入应用程序中引用所有层/组件?
和这篇文章(和其他各种材料).
但是,我不清楚将组合根放在库(DLL).NET项目中的哪个位置.该项目不属于本文中提到的任何特定类型.在桌面,控制台甚至Web应用程序中,这一点都是明确定义的.
我目前的方法是包装容器,寄存器类型并重新公开Resolve方法:
class DefaultBootstrapper : IBootstrapper {
public Bootstrapper() {
_container = new XXXContainer();
RegisterTypes(_container);
}
public T Resolve<T>() where T : class {
return _container.Resolve<T>();
}
// + other _container.Resolve() overloads
private readonly XXXContainer _container;
}
Run Code Online (Sandbox Code Playgroud)
然后我阻止库消费者创建库的根实例(例如,定义内部构造函数),从而强制使用单例工厂:
class XYZFactory {
static XYZFactory() {}
private XYZFactory(IBootstrapper bootstrapper) {
_bootstrapper = bootstrapper;
}
public static XYZFactory Instance {
get { return Singleton; }
}
public ABCType CreateABCType(string param1) {
return _bootstrapper.Resolve<ABCType>(param1, …Run Code Online (Sandbox Code Playgroud) 我的问题很简单,但遗憾的是我找不到任何答案.
使用MEF,我可以在类库程序集中指定一些内部导出和导入,如下所示:
[Export]
internal class SomeExport
{ }
[ModuleExport(typeof(SomeModule))]
internal class SomeModule : IModule
{
[ImportingConstructor]
internal SomeModule(SomeExport instance)
{ }
}
Run Code Online (Sandbox Code Playgroud)
我的CompositionContainer位于主EXE程序集中,但不知何故它设法SomeExport在类库程序集中实例化对象,以便我可以使用它.通常,我的内部类库类型不应该从EXE程序集中访问,但不知何故我创建了我的实例.
它是如何工作的?
我想做的一个小例子.
我有一个(堆栈分配)顶点的列表
class Vertex {
int id;
double x;
double y;
double z;
};
Run Code Online (Sandbox Code Playgroud)
并想要创建边缘列表
class Edge {
int id;
Vertex * source;
Vertex * target;
};
Run Code Online (Sandbox Code Playgroud)
两个指向其源和目标顶点的指针.
通常我会在这里找一个参考,但我希望能够在运行时更改源或目标顶点,所以我需要某种指针类型.
所以我的问题是:是否有一个智能指针在这里很有用,或者我应该只使用上面的普通指针?
编辑
解决了答案中出现的一些问题:
首先,列表应该拥有顶点,这就是它们在堆栈中的原因.
其次,ID用于其他程序.
它需要一个文件,其中包含所有顶点及其坐标的列表,以及所有边的列表及其两个顶点的ID.
第三,我需要某种指针,因为顶点的id在运行时会发生变化,而边缘的源和目标顶点可能会变为.
(其中包括进行某种切割和切片)
也许有人可以启发我.
如果放
<f:metadata>
<f:viewParam name="test" value="#{test.value}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
在模板内,设置者
setValue永远不会被调用,即调用preRender方法'call()'而不事先调用setter(参见下面的代码示例以供参考).
但是,如果将元数据块放在合成中,则会按预期调用它.
这是正常行为还是我做错了什么?
非常感谢任何见解.
Hanspeter
供参考,这里是非工作版本的完整代码示例:
testtemplate.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<f:metadata>
<f:viewParam name="test" value="#{test.value}"/>
</f:metadata>
<f:event type="preRenderView" listener="#{test.call}" />
<h:head>
<title>Test Template</title>
</h:head>
<h:body>
<ui:insert name="text" />
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
testcomposition.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="/templates/testtemplate.xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<ui:define name="text">
some text
</ui:define>
</ui:composition>
Run Code Online (Sandbox Code Playgroud)
这里是工作 …
我需要使用python wand(用于python的image-magick绑定)来创建合成图像,但是除了简单地将前景图像粘贴到背景图像之外,我在确定如何做任何事情时遇到了一些麻烦.我想要的是,鉴于我有两个像:

和

两个jpegs,我想删除猫的白色背景,然后粘贴在房间里.其他python图像模块的答案,比如PIL,也很好,我只需要一些东西来自动化合成过程.提前致谢.
我有一个关于在UML图中指示多重性的问题.
我有一个SpriteObject类,它有一个动画列表.SpriteObject可以有0 ..*动画.所有动画都是在SpriteObject中创建的,并不是自己存在的.
我不是百分百肯定我应该用多重性来表明这一点.搜索网络后,我发现了以下3个选项:
选项1:多重性应该像这样表示,因为每个SpriteObject都有0个或更多的动画.由于动画没有关于SpriteObject存在的线索,因此SpriteObject侧面没有指示多重性.

选项2:多样性应该像这样在两侧指示,因为我们需要指出两个类之间的局部关系,因此1 SpriteObject具有0个或更多个动画.

选项3:双方都应该表示多样性,因为我们需要能够阅读多重性并将其理解为整体(游戏)的一部分.游戏可以包含0 ..*SpriteObjects,SpriteObject可以包含0 ..*动画.这就是为什么0 ..*SpriteObjects有0 ..*动画
谁能告诉我哪个选项是正确的?(如果有的话)
我们可以有两种类型f, g :: * -> *,它们不是monad,但它们的组成是.例如对于任意固定s:
f a := s -> a
g a := (s, a)
Run Code Online (Sandbox Code Playgroud)
g a不是monad(除非我们限制s为monoid),但是f (g a)是monad状态s -> (s, a).(不同于仿函数和应用性函子,即使这两个f和g是单子,它们的成分可能不是.)
仿函数或应用仿函数是否有类似的例子?即是,所述组合物f和g是AA函子(或适用函子),即使
f并且g不是(应用性)函子,另一个是,或有效的Java第3版,第18项:优先于继承的组合描述了使用继承向类添加行为的问题:
子类中脆弱性的一个相关原因是它们的超类可以在后续版本中获取新方法.假设程序依赖于其安全性,因为插入到某个集合中的所有元素都满足某些谓词.这可以通过继承集合并覆盖每个能够添加元素的方法来保证,以确保在添加元素之前满足谓词.这可以正常工作,直到在后续版本中将能够插入元素的新方法添加到超类中.一旦发生这种情况,仅通过调用新方法就可以添加"非法"元素,而新方法不会在子类中重写.
推荐的解决方案:
不要扩展现有类,而是为新类提供一个引用现有类实例的私有字段...新类中的每个实例方法都会在现有类的包含实例上调用相应的方法并返回结果.这称为转发,新类中的方法称为转发方法 ...向现有类添加新方法对新类没有影响...编写转发方法很繁琐,但你必须为每个接口只写一次可重用转发类,并为您提供转发类.例如,Guava为所有集合接口提供转发类.
我的问题是,风险是否仍然存在方法也可以添加到转发类,从而打破子类的不变量?像Guava这样的外部库如何在转发类时采用更新的方法而不会冒客户端的完整性?
我正在寻找一种在 Android 活动中组合不同功能的方法,该方法应该可用于不同的活动类。具体来说,问题是由于覆盖 open 方法而产生的,其中还必须调用 super 的实现。
open class FirstActivity : FragmentActicity() {
override fun onStart() {
super.onStart()
doSomething()
}
}
Run Code Online (Sandbox Code Playgroud)
这很简单,但它不可重复使用。例如,我可能希望使用不同的基本活动类具有相同的行为:
open class SecondActivity : AppCompatActivity() {
override fun onStart() {
super.onStart()
doSomething()
}
}
Run Code Online (Sandbox Code Playgroud)
我必须复制代码的地方。如果我有一个非常基本的功能,比如跟踪活动的状态,我会或多或少地希望在我所有具有不同基类的活动中使用它。当我想创建更多可以组合的功能时,情况会变得更糟:
open class ThirdActivity : FragmentActivity() {
override fun onResume() {
super.onResume()
doSomeResuming()
}
}
open Class FirstActivityAgain : ThirdActivity {
override fun onStart() {
super.onStart()
doSomething()
}
}
class MyFragmentActivity : FirstActivity() {
override fun onStop() {
doSomethingElse()
super.onStop()
}
}
class MyFragmentActivityWithResuming …Run Code Online (Sandbox Code Playgroud) android dependency-injection composition android-activity kotlin
在 main.js 中,我设置axios为全局函数。
//main.js
import { createApp } from 'vue';
import App from './App.vue';
import axios from 'axios';
const app = createApp(App);
app.config.globalProperties.$http = axios;
app.mount('#app');
Run Code Online (Sandbox Code Playgroud)
问题是如何使用组合 api 在组件中调用此函数?
<script>
export default {
setup() {
//how do I call the `axios` global function?
};
</script>
Run Code Online (Sandbox Code Playgroud) composition ×10
c# ×2
.net ×1
android ×1
applicative ×1
axios ×1
c++ ×1
facelets ×1
functor ×1
guava ×1
haskell ×1
imagemagick ×1
inheritance ×1
java ×1
jsf ×1
kotlin ×1
magickwand ×1
mef ×1
multiplicity ×1
oop ×1
python ×1
uml ×1
viewparams ×1
vue.js ×1
vuejs3 ×1
wand ×1