現状のアプリケーションのアーキテクチャをアプリケーションの形態毎にまとめた資料(でいいのかな?)がcodeplexで公開されています。
Pocket Guideといいつつ150ページぐらいのものが多いですが。。。
アプリケーションを構築する上で、どういう技術要素を選択するか、といった時点で参考になることも多そうです。
ざっとでも見ておきたいとこですが、、、分量がなぁ(w
現状のアプリケーションのアーキテクチャをアプリケーションの形態毎にまとめた資料(でいいのかな?)がcodeplexで公開されています。
Pocket Guideといいつつ150ページぐらいのものが多いですが。。。
アプリケーションを構築する上で、どういう技術要素を選択するか、といった時点で参考になることも多そうです。
ざっとでも見ておきたいとこですが、、、分量がなぁ(w
なお、当ソースは、Visual C# 2005 Express Editionで動作を確認しています。
Builder
using System;
namespace Gushwell.DesignPatterns {
public abstract class Builder {
public abstract void MakeTitle(string title);
public abstract void MakeString(string str);
public abstract void MakeItems(string[] items);
public abstract void Close();
}
}
TextBuilder
using System;
using System.Text;
namespace Gushwell.DesignPatterns {
public class TextBuilder : Builder {
// このフィールドに文書を構築していく
private StringBuilder buffer = new StringBuilder();
// 完成した文書
virtual public string Result {
get { return buffer.ToString(); }
}
// プレーンテキストでのタイトル
public override void MakeTitle(string title) {
buffer.Append("==============================\n"); // 飾り線
buffer.Append("『" + title + "』\n"); // 『』つきのタイトル
buffer.Append("\n"); // 空行
}
// プレーンテキストでの文字列
public override void MakeString(string str) {
buffer.Append('■' + str + "\n"); // ■つきの文字列
buffer.Append("\n"); // 空行
}
// プレーンテキストでの箇条書き
public override void MakeItems(string[] items) {
for (int i = 0; i < items.Length; i++) {
buffer.Append(" ・" + items[i] + "\n"); // ・つきの項目
}
buffer.Append("\n"); // 空行
}
// 文書の完成
public override void Close() {
buffer.Append("==============================\n"); // 飾り線
}
}
}
HTMLBuilder
using System;
using System.IO;
namespace Gushwell.DesignPatterns {
public class HTMLBuilder : Builder {
private string filename; // 作成するファイル名
private StreamWriter writer; // ファイルに書き込む
// 完成した文書
public virtual string Result {
get { return filename; } // ファイル名を返す
}
// HTMLファイルでのタイトル
public override void MakeTitle(string title) {
filename = title + ".html"; // タイトルを元にファイル名決定
try {
writer = new StreamWriter(filename, false);
} catch (System.IO.IOException e) {
Console.WriteLine(e.StackTrace);
}
// タイトルを出力
writer.WriteLine("");
writer.WriteLine("");
writer.WriteLine("
" + title + "
");
}
// HTMLファイルでの文字列
public override void MakeString(string str) {
writer.WriteLine("
" + str + "
"); //
タグで出力
}
// HTMLファイルでの箇条書き
public override void MakeItems(string[] items) {
writer.WriteLine("
Director
using System;
namespace Gushwell.DesignPatterns {
public class Director {
private Builder builder;
public Director(Builder builder) {
// Builderのサブクラスのインスタンスが与えられるので、
// builderフィールドに保持しておく。
this.builder = builder;
}
public virtual void Construct() {
// 文書構築
builder.MakeTitle("Greeting"); // タイトル
builder.MakeString("朝から昼にかけて"); // 文字列
builder.MakeItems(new string[]
{ "おはようございます。", "こんにちは。" });
builder.MakeString("夜に"); // 別の文字列
builder.MakeItems(new string[]
{ "こんばんは。", "おやすみなさい。", "さようなら。" });
builder.Close(); // 文書を完成させる
}
}
}
Program
using System;
namespace Gushwell.DesignPatterns {
public class Program {
public static void Main(string[] args) {
if (args.Length != 1) {
Usage();
return;
}
if (args[0].Equals("plain")) {
TextBuilder textbuilder = new TextBuilder();
Director director = new Director(textbuilder);
director.Construct();
string result = textbuilder.Result;
Console.WriteLine(result);
} else if (args[0].Equals("html")) {
HTMLBuilder htmlbuilder = new HTMLBuilder();
Director director = new Director(htmlbuilder);
director.Construct();
string filename = htmlbuilder.Result;
Console.WriteLine(filename + "が作成されました。");
} else {
Usage();
return;
}
}
public static void Usage() {
Console.WriteLine("Usage: BuilderSample plain プレーンテキストで文書作成");
Console.WriteLine("Usage: BuilderSample html HTMLファイルで文書作成");
}
}
}
デモ環境を作っていて確認したことですが、
WIndows Server 2008 の環境に SharePoint Server 2007 をそのまま、インストールしてもエラーが出てインストールできません。
これは、初期版の SharePoint Server 2007 が Windows Server 2008 に対応していないためです。
なので、インストールメディアの Updates フォルダ(更新プログラムを放り込むフォルダですね。)に SP1 を適用してから、インストールする必要があるとのことです。
また、テスト環境での確認であれば、MSDN サブスクリプションから、SP1 適用済みのメディアがダウンロードできますので、それを利用してもインストールすることはできます。
情報が公開されていても分かりづらいようなので、この場でご紹介させていただきました。
正式な情報は以下です。
Windows Server 2008 で Office SharePoint Server 2007 のスタンドアロン インストールを実行する
Cloudship: Membership Provider for the Cloud
ASP.NETに組み込まれているMembershipの各コントロールは、標準だとMembershipProviderを通してSQL Server上のデータベースに格納されているユーザ情報を利用するようになっています。
Azureではデータはクラウド上の専用のストレージに格納することになりますが、そこにユーザ情報を格納して利用できるようなMembershipProviderを作成する方法が例示されています。
この手のプロバイダは標準で提供されるようになるような気もしますが、知っておいて損はないかと。
#あれ、SDKに含まれるサンプルにMembership使ってるものなかったかな。。。
なお、当ソースは、Visual C# 2005 Express Editionで動作を確認しています。
Productクラス
using System;namespace Gushwell.DesignPatterns.Framework
{
public abstract class Product {
public abstract void Use();}
}
Factoryクラス
using System;namespace Gushwell.DesignPatterns.Framework
{
public abstract class Factory {public Product Create(string owner)
{
Product p = CreateProduct(owner);RegisterProduct(p);return p;}
protected abstract Product CreateProduct(string owner);
protected abstract void RegisterProduct(Product product);
}
}
IDCardクラス
using System;
using Gushwell.DesignPatterns.Framework;
namespace Gushwell.DesignPatterns.IDCard {
public class IDCard : Product {
private string owner;public IDCard(string owner) {
Console.WriteLine(owner + "のカードを作ります。");
this.owner = owner;}
public override void Use() {
Console.WriteLine(owner + "のカードを使います。");
}public virtual string Owner {
get {
return owner; }
}
}
}
IDCardFactoryクラス
using System;
using System.Collections.Generic;
using Gushwell.DesignPatterns.Framework;
namespace Gushwell.DesignPatterns.IDCard {
public class IDCardFactory : Factory {
private Listowners = new List ();
protected override Product CreateProduct(string owner) {
return new IDCard(owner);}
protected override void RegisterProduct(Product product) {
owners.Add(((IDCard)product).Owner);}public virtual ListOwners {
get {
return owners; }
}
}
}
Programクラス
using System;
using Gushwell.DesignPatterns.Framework;
using Gushwell.DesignPatterns.IDCard;
namespace Gushwell.DesignPatterns {
public class Program {
[STAThread]public static void Main(string[] args) {
Factory factory = new IDCardFactory();
Product card1 = factory.Create("結城浩");
Product card2 = factory.Create("とむら");
Product card3 = factory.Create("佐藤花子");
card1.Use();card2.Use();card3.Use();}
}
}
なお、当ソースは、Visual C# 2005 Express Editionで動作を確認しています。
Factoryクラス
using System;
namespace Gushwell.DesignPatterns.BaseFactory {
public abstract class Factory {
public static Factory GetFactory(string classname) {
Factory factory = null;
try {
factory = (Factory)Activator.CreateInstance(Type.GetType(classname));
} catch (System.TypeLoadException) {
Console.Error.WriteLine("クラス " + classname + " が見つかりません。");
} catch (System.Exception e) {
Console.Error.WriteLine(e.StackTrace);
}
return factory;
}
public abstract Link CreateLink(string caption, string url);
public abstract Tray CreateTray(string caption);
public abstract Page CreatePage(string title, string author);
}
}
Pageクラス
using System;
using System.Text;
using System.Collections.Generic;
using System.IO;
namespace Gushwell.DesignPatterns.BaseFactory {
public abstract class Page {
protected string title;
protected string author;
protected List- content = new List
- ();
public Page(string title, string author) {
this.title = title;
this.author = author;
}
public virtual void Add(Item item) {
content.Add(item);
}
public virtual void Output() {
try {
string filename = title + ".html";
StreamWriter writer = new StreamWriter(filename, false, Encoding.Default);
writer.Write(this.MakeHTML());
writer.Close();
Console.WriteLine(filename + " を作成しました。");
} catch (System.IO.IOException e) {
Console.Error.WriteLine(e.StackTrace);
}
}
public abstract string MakeHTML();
}
}
Trayクラス
using System;
using System.Collections.Generic;
namespace Gushwell.DesignPatterns.BaseFactory {
public abstract class Tray : Item {
protected List- tray = new List
- ();
public Tray(string caption)
: base(caption) {
}
public virtual void Add(Item item) {
tray.Add(item);
}
}
}
Itemクラス
using System;
namespace Gushwell.DesignPatterns.BaseFactory {
public abstract class Item {
protected string caption;
public Item(string caption) {
this.caption = caption;
}
public abstract string MakeHTML();
}
}
Linkクラス
using System;
namespace Gushwell.DesignPatterns.BaseFactory {
public abstract class Link : Item {
protected string url;
public Link(string caption, string url)
: base(caption) {
this.url = url;
}
}
}
なお、当ソースは、Visual C# 2005 Express Editionで動作を確認しています。
Singletonクラス
using System;
namespace Gushwell.DesignPatterns {
public sealed class Singleton {
public static Singleton Instance {
get { return singleton; }
}
private static readonly Singleton singleton = new Singleton();
private Singleton() {
Console.WriteLine("インスタンスを生成しました。");
}
}
}
Programクラス
using System;
namespace Gushwell.DesignPatterns {
public class Program {
[STAThread]
public static void Main(System.String[] args) {
Console.WriteLine("Start.");
Singleton obj1 = Singleton.Instance;
Singleton obj2 = Singleton.Instance;
if (obj1 == obj2) {
Console.WriteLine("obj1とobj2は同じインスタンスです。");
} else {
Console.WriteLine("obj1とobj2は同じインスタンスではありません。");
}
Console.WriteLine("End.");
Console.ReadLine();
}
}
}
なお、当ソースは、Visual C# 2005 Express Editionで動作を確認しています。 IProductインターフェース
using System;
namespace Gushwell.DesignPatterns.Prototype.Framework {
public interface IProduct : System.ICloneable {
void Use(string s);
}
}
Managerクラス
using System;
using System.Collections;
namespace Gushwell.DesignPatterns.Prototype.Framework {
public class Manager {
private Hashtable showcase = new Hashtable();
public virtual void Register(string name, IProduct proto) {
showcase[name] = proto;
}
public virtual IProduct Create(string protoname) {
IProduct p = (IProduct)showcase[protoname];
return (IProduct)p.Clone();
}
}
}
UnderlinePenクラス
using System;
using System.Text;
using Gushwell.DesignPatterns.Prototype.Framework;
namespace Gushwell.DesignPatterns.Prototype {
public class UnderlinePen : IProduct {
private char ulchar;
public UnderlinePen(char ulchar) {
this.ulchar = ulchar;
}
public virtual void Use(string s) {
int length = Encoding.GetEncoding("shift-jis").GetByteCount(s);
Console.WriteLine("\"" + s + "\"");
Console.Write(" ");
for (int i = 0; i < length; i++) {
Console.Write(ulchar);
}
Console.WriteLine("");
}
public virtual object Clone() {
return (IProduct)MemberwiseClone();
}
}
}
MessageBoxクラス
using System;
using System.Text;
using Gushwell.DesignPatterns.Prototype.Framework;
namespace Gushwell.DesignPatterns.Prototype {
public class MessageBox : IProduct {
private char decochar;
public MessageBox(char decochar) {
this.decochar = decochar;
}
public virtual void Use(string s) {
int length = Encoding.GetEncoding("shift-jis").GetByteCount(s);
for (int i = 0; i < length + 4; i++) {
Console.Write(decochar);
}
Console.WriteLine("");
Console.WriteLine(decochar + " " + s + " " + decochar);
for (int i = 0; i < length + 4; i++) {
Console.Write(decochar);
}
Console.WriteLine("");
}
public virtual object Clone() {
return (IProduct)MemberwiseClone();
}
}
}
Programクラス
using System;
using Gushwell.DesignPatterns.Prototype.Framework;
namespace Gushwell.DesignPatterns.Prototype {
public class Program {
[STAThread]
public static void Main(string[] args) {
// 準備
Manager manager = new Manager();
UnderlinePen upen = new UnderlinePen('~');
MessageBox mbox = new MessageBox('*');
MessageBox sbox = new MessageBox('/');
manager.Register("strong message", upen);
manager.Register("warning box", mbox);
manager.Register("slash box", sbox);
// 生成
IProduct p1 = manager.Create("strong message");
p1.Use("Hello, world.");
IProduct p2 = manager.Create("warning box");
p2.Use("Hello, world.");
IProduct p3 = manager.Create("slash box");
p3.Use("Hello, world.");
}
}
}
IIS7ではURLリライトモジュールが提供されていて、URLの書き換えが容易に行えるようになっています。
ただし書き換えを行った後でPostbackが起きると、書き換えられた後のURLになってしまいます。
このような不具合に対応する方法がまとめられています。
といっても、Page_LoadでActionを書き換える、という原始的な方法ですが。
まあ、そのような用途のために元のURLがServerVariablesに格納されている、ということが重要な情報ですね。
StackFrame クラス (System.Diagnostics) を使用すると、呼び出し元メソッドを取得することができる。しかし、Release ビルドされたアセンブリでは JIT 最適化により呼び出し元メソッドがインライン化されている可能性がある。
例えば、次のコードの実行結果を Debug ビルドと Release ビルド (非デバッグ実行) とで比較すると一目瞭然だ。
using
Powered by WordPress