技术标签: UI Access Microsoft Security
l
允許要求一個抽象物件或介面,ObjectBuilder會依據程式或組態檔的設定,傳回一個實體物件。
|
l
回傳一個既存物件,或是每次回傳一個新的物件(多半用於Dependency、Singleton情況,稍後會有詳細說明)。
|
l
透過特定的Factory建立一個物件,這個Factory可以依據組態檔的設定來建立物件(CustomFactory,隸屬於Enterprise Common Library)。
|
l
當物件擁有一個以上的建構子時,依據已有的參數,自動選取相容的建構子來建立要求的物件。(Consturctor Injection)
|
l
允許物件於建立後,透過程式或組態檔來賦值至屬性,或是呼叫特定的函式。(Setter Injection、Interface Injection)
|
l
提供一組Attribute,讓設計師可以指定需要Injection的屬性,亦或是於物件建立後需要呼叫的函式,也就是使用Reflection來自動完成Injection動作。
|
l
提供IBuilerAware介面,實作此介面的物件,ObjectBuilder會於建立該物件後,呼叫OnBuildUp或是OnTearDown函式。
|
l
提供TearDown機制,按建立物件的流程,反向釋放物件。
|
using
System;
using
System.Collections.Generic;
using
System.Text;
using
Microsoft.Practices.ObjectBuilder;
namespace
SimpleApp
{
class Program
{
static void Main(string[] args)
{
Builder builder = new Builder();
TestObject obj = builder.BuildUpTestObject>(
new
Locator(),
null,
null);
obj.SayHello();
Console.ReadLine();
}
}
public class TestObject
{
public void SayHello()
{
Console.WriteLine("TEST");
}
}
}
|
private
StrategyList<tstageenum> strategies = <span style="COLOR: blue">new</span> <span style="COLOR: teal">StrategyList</span><tstageenum>();</tstageenum></tstageenum>
public
BuilderBase()
{
}
public
PolicyList Policies
{
get { return policies; }
}
public
StrategyList<tstageenum> Strategies</tstageenum>
{
get { return strategies; }
}
public
Builder(IBuilderConfiguratorBuilderStage> configurator)
{
Strategies.AddNewTypeMappingStrategy>(
BuilderStage.PreCreation);
Strategies.AddNewSingletonStrategy>(
BuilderStage.PreCreation);
Strategies.AddNewConstructorReflectionStrategy>(
BuilderStage.PreCreation);
Strategies.AddNewPropertyReflectionStrategy>(
BuilderStage.PreCreation);
Strategies.AddNewMethodReflectionStrategy>(
BuilderStage.PreCreation);
Strategies.AddNewCreationStrategy>(
BuilderStage.Creation);
Strategies.AddNewPropertySetterStrategy>(
BuilderStage.Initialization);
Strategies.AddNewMethodExecutionStrategy>(
BuilderStage.Initialization);
Strategies.AddNewBuilderAwareStrategy>(
BuilderStage.PostInitialization);
Policies.SetDefaultICreationPolicy>(
new
DefaultCreationPolicy());
if (configurator != null)
configurator.ApplyConfiguration(this);
}
|
public
TTypeToBuild BuildUp<ttypetobuild>(<span style="COLOR: teal">IReadWriteLocator</span> locator,</ttypetobuild>
string
idToBuild, object existing, params PolicyList[] transientPolicies)
{
return (TTypeToBuild)BuildUp(locator, typeof(TTypeToBuild), idToBuild, existing, transientPolicies);
}
public
virtual object BuildUp(IReadWriteLocator locator, Type typeToBuild,
string idToBuild, object existing, params PolicyList[] transientPolicies)
{
....................
return DoBuildUp(locator, typeToBuild, idToBuild, existing, transientPolicies);
...................
}
private
object DoBuildUp(IReadWriteLocator locator, Type typeToBuild, string idToBuild, object existing,
PolicyList[] transientPolicies)
{
IBuilderStrategyChain chain = strategies.MakeStrategyChain();
..............
IBuilderContext context = MakeContext(chain, locator, transientPolicies);
..........................
object result = chain.Head.BuildUp(context, typeToBuild, existing, idToBuild);
.......................
}
private
IBuilderContext MakeContext(IBuilderStrategyChain chain,
IReadWriteLocator locator, params PolicyList[] transientPolicies)
{
.............
return new BuilderContext(chain, locator, policies);
}
|
public
Builder(IBuilderConfiguratorBuilderStage> configurator)
{
..................
Policies.SetDefaultICreationPolicy>(
new
DefaultCreationPolicy());
.................
}
|
public
override object BuildUp(IBuilderContext context, Type typeToBuild, object existing, string idToBuild)
{
if (existing != null)
BuildUpExistingObject(context, typeToBuild, existing, idToBuild);
else
existing = BuildUpNewObject(context, typeToBuild, existing, idToBuild);
return base.BuildUp(context, typeToBuild, existing, idToBuild);
}
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.SerializationFormatter)]
private
object BuildUpNewObject(IBuilderContext context, Type typeToBuild,
object
existing, string idToBuild)
{
ICreationPolicy policy = context.Policies.GetICreationPolicy>(typeToBuild, idToBuild);
.........................
InitializeObject(context, existing, idToBuild, policy);
return existing;
}
private
void InitializeObject(IBuilderContext context, object existing, string id, ICreationPolicy policy)
{
................
ConstructorInfo constructor = policy.SelectConstructor(context, type, id);
...................
object[] parms = policy.GetParameters(context, type, id, constructor);
...............
method.Invoke(existing, parms);
}
|
public
class SingletonStrategy : BuilderStrategy
{
public
override object BuildUp(IBuilderContext context, Type typeToBuild,
object
existing, string idToBuild)
{
DependencyResolutionLocatorKey key = new DependencyResolutionLocatorKey(
typeToBuild, idToBuild);
if (context.Locator != null && context.Locator.Contains(key, SearchMode.Local))
{
TraceBuildUp(context, typeToBuild, idToBuild, "");
return context.Locator.Get(key);
}
return base.BuildUp(context, typeToBuild, existing, idToBuild);
}
}
|
locator.Add("Test",new TestObject());
.............
TestObject obj = locator.GetTestObject>(
"Test");
|
PS:
ObjectBuidler
的
Locator
離完善的
Service Locator
還有段距離。
|
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Configuration;
using
Microsoft.Practices.ObjectBuilder;
using
Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder;
using
Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
namespace
OB_ConstructorInjectionTest
{
class Program
{
static void UseValueParameter(MyBuilderContext context)
{
ConstructorPolicy creationPolicy = new ConstructorPolicy();
creationPolicy.AddParameter(new ValueParameter(typeof(IDataProcessor),
new
PromptDataProcessor()));
context.Policies.SetICreationPolicy>(creationPolicy, typeof(InputAccept), null);
}
static void Main(string[] args)
{
MyBuilderContext context = new MyBuilderContext(new Locator());
context.InnerChain.Add(new CreationStrategy());
UseValueParameter(context);
InputAccept accept = (InputAccept)context.HeadOfChain.BuildUp(context,
typeof
(InputAccept), null, null);
accept.Execute();
Console.Read();
}
}
internal class MyBuilderContext : BuilderContext
{
public IReadWriteLocator InnerLocator;
public BuilderStrategyChain InnerChain = new BuilderStrategyChain();
public PolicyList InnerPolicies = new PolicyList();
public LifetimeContainer lifetimeContainer = new LifetimeContainer();
public MyBuilderContext()
: this(new Locator())
{
}
public MyBuilderContext(IReadWriteLocator locator)
{
InnerLocator = locator;
SetLocator(InnerLocator);
StrategyChain = InnerChain;
SetPolicies(InnerPolicies);
if (!Locator.Contains(typeof(ILifetimeContainer)))
Locator.Add(typeof(ILifetimeContainer), lifetimeContainer);
}
}
public class InputAccept
{
private IDataProcessor _dataProcessor;
public void Execute()
{
Console.Write("Please Input some words:");
string input = Console.ReadLine();
input = _dataProcessor.ProcessData(input);
Console.WriteLine(input);
}
public InputAccept(IDataProcessor dataProcessor)
{
_dataProcessor = dataProcessor;
}
}
public interface IDataProcessor
{
string ProcessData(string input);
}
public class DummyDataProcessor : IDataProcessor
{
#region
IDataProcessor Members
public string ProcessData(string input)
{
return input;
}
#endregion
}
public class PromptDataProcessor : IDataProcessor
{
#region
IDataProcessor Members
public string ProcessData(string input)
{
return "your input is: " + input;
}
#endregion
}
}
|
/* *Copyright(c) 2016, 烟台大学计算机学院 *All rights reserved. *文件名称:建立单链表.cpp *作 者:孟琪琪 *完成日期:2016年 9月 22日 *问题描述:定义单链表存储结构,用头插法和尾插法建立单链表,并显示建立好以后的结果。 *输入描述:此程序没有输入。 *程序输出
Appium实现自动化底层是依赖UiAutomator框架,定位元素也是经由UiAutomator处理后转换Accessibility服务对象完成元素查找并且操作。在前面介绍过Appium-Desktop支持的ID、XPATH、ACCESSIBILITY_ID、CLASS_Name定位,对于这四种定位比较容易理解,剩下的ANDROID_UIAUTOMATOR定位在这篇文章介绍。一、疑问..._android_uiautomator
判断设备唯一性 if ((!deviceId.equals("0") && !schoolDeviceId.equals("0"))) { Optional<SchoolDevice> deviceOpt = deviceRepository.findById(Integer.parseInt(schoolDeviceId)); if (!device..._网页判断设备唯一性
本文介绍在Debian/Ubuntu/CentOS/RHEL系统下安装Imapsync的方法,并使用Imapsync将邮件帐户从一个服务器导入到另一个服务器。背景我使用Ispconfig提供Web托管服务,很长一段时间里,将现有的Cpanel客户迁移到Ispconfig真的很痛苦,特别是当你需要导入所有用户的邮箱和数据时,我不得不在两台服务器之间手动导入Dovecot邮箱文件夹。这是一个枯燥乏味的..._imapsync
目录:系统学习 Java IO---- 目录,概览文件输入流 FileInputStream这是一个简单的FileInputStream示例:InputStream input = new FileInputStream("D:\\input.txt");int data = input.read();while(data != -1) { //do something w...
Dart与消息循环机制翻译自https://www.dartlang.org/articles/event-loop/异步任务在Dart中随处可见,例如许多库的方法调用都会返回Future对象来实现异步处理,我们也可以注册Handler来响应一些事件,如:鼠标点击事件,I/O流结束和定时器到期。这篇文章主要介绍了Dart中与异步任务相关的消息循环机制,阅读完这篇文章后相信你可写出更赞的异步执...
项目中遇到预览docx和pdf要求:在开发过程中webView支持预览pdf和docx,so直接使用webView,但在后期测试阶段发现部分docx预览时为乱码现象,查找方案发现编码utf-8以及GBK等都无法解决乱码问题。后发现如下方案能做修改:content-type 用于定义用户的浏览器或相关设备如何显示将要加载的数据,或者如何处理将要加载的数据,
根据官方代码行修改后:from pylab import *from numpy import *from PIL import Image# If you have PCV installed, these imports should workfrom PCV.geometry import homography, warpfrom PCV.localdescriptors im..._http://blog.csdn.net/shanghaiqianlun/article/details/12090595
Java对象初始化,对象初始化流程: 加载字节码(只加载一次)->初始化字段->父类构造方法->自身构造方法。_java 对象初始化
有一个表名为tb,字段段名为request_id,数据类型int 更改为VARCHAR2(64)。1、假设字段数据为空,则不管改为什么字段类型,可以直接执行:alter table tb modify (request_id varchar2(64));2、假设字段没有数据,则改为varchar2(20)可以直接执行:alter table tb modify (request_id varchar2(64));3、假设字段有数据,则改为varchar2(40)执行时会弹出:“ORA-0_oracle 中modify 有数据和没有数据
0 0x00000000 作业完成。1 0x00000001 不正确的函数。2 0x00000002 系统找不到指定的档案。3 0x00000003 系统找不到指定的路径。4 0x00000004 系统无法开启档案。5 0x00000005 拒绝存取。6 0x00000006 无效的代码。7 0x00000007 储存体控制区块已毁。8 0x00000008 储存体空间不足,...
登录成功后,我们就可以进入页面了.如果登录或者注册不晓得的,可以先去看前面几个博客,这里就简单的把数据库注册的数据展示出来,细节什么的,慢慢去添加更改就好了.由于要展示数据库的注册信息,我们要把信息放的表格中展示出来,这里就要用到jsp的东西了,所以先了解一下jsp;<% 代码片段 %> : 在这中间就是填写Java代码的<%= 表达式 %> : 这个是写表达式这里就说这两个,其它的可以自行学习一下:那么我们创建一个.jsp页面来当作列表页面<%@page imp_登录成功页面